`

多个任务运行终止以及资源共享例子

阅读更多
场景:
公园的管理人员希望知道每天通过多个大门进入公园的总人数,这样为每个门设置一个计数器,总人数也就是各个计数器的和,代码如下所示:

计数器类
public class Count {
         private int count=0;
	private Random rand=new Random(47);
	
         public synchronized int increment(){
		int temp=count;
		if(rand.nextBoolean())
			Thread.yield();
		return (count=++temp);
	}
	
	public synchronized int value(){
		return count;
	}
	
	
}

=====================Entrance
public class Entrance implements Runnable{
	private static Count count=new Count();
	
	private static List<Entrance> entrances=new ArrayList<Entrance>();
	
	private int sum=0;
	
	private final int id;
	
	private static volatile boolean canceled=false;
	
	public static void cancel(){
		canceled=true;
	}
	
	
	public Entrance(int id) {
		// TODO Auto-generated constructor stub
		this.id=id;
		entrances.add(this);
	}
	
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(!canceled){
			synchronized(this){
				++sum;
			}
			
			System.out.println(this+" Total:"+count.increment());
			try {
				TimeUnit.MILLISECONDS.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("sleep interrupted...");
			}
			
			
		}
		
		System.out.println("Stopping:"+this);
	}
	
	
	public synchronized int getValue(){
		return sum;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Entrance "+id+":"+getValue();
	}
	
	
	public static int getTotalCount(){
		return count.value();
	}
	
	public static int sumEntrances(){
		int sum=0;
		for(Entrance entrance:entrances){
			sum+=entrance.getValue();
			
		}
		return sum;
	}
}

===========================公园管理人员查看这几个门的进入人数
public class Garden {

	public static void main(String[] args) throws InterruptedException{
		ExecutorService exec=Executors.newCachedThreadPool();
		for(int i=0;i<5;i++)  //这里面有5个入口
			exec.execute(new Entrance(i));//启动线程计数人数
		try {
			TimeUnit.SECONDS.sleep(4);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Entrance.cancel();//各个任务共享的变量终止
		exec.shutdown();
		if(!exec.awaitTermination(250,TimeUnit.MILLISECONDS ));
			System.out.println("some tasks was not terminated!");
			System.out.println("total:"+Entrance.getTotalCount());
			System.out.println("sum of entrances :"+Entrance.sumEntrances());
		
	}
}
分享到:
评论

相关推荐

    java-servlet-api.doc

    一个Servlet环境不能在虚拟主机之间共享。 Servlet引擎能够允许一个Servlet环境有它自己的活动范围。 例如,一个Servlet环境是属于bank应用的,它将被映射到/bank目录下。在这种情况下,一个对getContext方法的调用...

    Delphi多线程编程之三 同步读写全局数据

    利用CreateMutex()可以防止程序多个实例运行,如下例: Program ABC; Uses Forms,Windows,…; {$R *.res} Var hMutex:Hwnd; Begin Application.Initialize; hMutex:=CreateMutex(nil,False,Pchar...

    《Windows高级编程指南(第三版)》(含PASCAL例子)

    (Local Input State) TLSStat -- 在EXE模块中使用静态TLS TLSDyn & -- 在DLL模块中使用动态TLS SomeLib ModUse & -- 使用DLL中带有共享属性的PE节存储数据 Module DocStats -- 利用事件对象使多个线程协同工作 ...

    linux系统编程之线程.zip

    【练习】:循环创建多个线程,每个线程打印自己是第几个被创建的线程。(类似于进程循环创建子进程) 【more_pthrd.c】 拓展思考:将pthread_create函数参4修改为(void *)&i, 将线程主函数内改...

    Delphi5开发人员指南

    4.6.3 避免创建一个窗体的多个实例 106 4.6.4 在DPR文件中增加代码 107 4.6.5 覆盖应用程序的异常处理 107 4.6.6 显示一个封面 109 4.6.7 使窗体尺寸最小 110 4.6.8 运行没有窗体的项目 111 4.6.9 退出Windows 112 ...

    oracle数据库经典题目

    当多个用户同时连接同一个实例时,SGA区数据供多个用户共享,所以SGA区又称为共享全局区。用户对数据库的各种操作主要在SGA区中进行。该内存区随数据库实例的创建而分配,随实例的终止而释放。PGA区是在用户进程连接...

    Java性能优化

    控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic的变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 ...

    TCPIP高效编程:改善网络程序的44个技巧 PDF中文版带书签-目录

    本书组织方式比较特别,正文部分包括4 章,将网络编程中存在的常见问题组织成44 个技巧,探讨问题的过程中构建并运行了多个程序,并且指出了代码的源地址,便于读者查看。全书以技巧的形式解答了日常工作中遇到的...

    PHP和MySQL Web开发第4版pdf以及源码

    12.7.3 设置一个/多个从服务器 12.8 进一步学习 12.9 下一章 第13章 MySQL高级编程 13.1 LOAD DATA INFILE语句 13.2 存储引擎 13.3 事务 13.3.1 理解事务的定义 13.3.2 通过InnoDB使用事务 13.4 外键 ...

    微软活动目录管理管理简明手册

    共享相同的公用架构和全局目录的一个或多个域称为域林。如果树林中的多个域有连续的DNS域名,则该结构称为域树。如^60090102c^所示。 ' C, [0 _7 o0 Q0 w, S" v+ z( D* t7 N 如果相关域树共享相同的活动架构以及目录...

    Access+2000中文版高级编程

    4.4 通过编程实现同一窗体的多个副本 83 4.4.1 支持多窗体实例 84 4.4.2 检查Employees窗体的代码 84 4.4.3 自动关闭Employees窗体 86 4.5 小 结 87 第5章 使用DAO 88 5.1 理解DAO 88 5.1.1 了解...

    Access 2000中文版高级编程(part1)

    4.4 通过编程实现同一窗体的多个副本 83 4.4.1 支持多窗体实例 84 4.4.2 检查Employees窗体的代码 84 4.4.3 自动关闭Employees窗体 86 4.5 小 结 87 第5章 使用DAO 88 5.1 理解DAO 88 5.1.1 了解数据库的内部...

    PHP和MySQL WEB开发(第4版)

    12.7.3 设置一个/多个从服务器 12.8 进一步学习 12.9 下一章 第13章 MySQL高级编程 13.1 LOAD DATA INFILE语句 13.2 存储引擎 13.3 事务 13.3.1 理解事务的定义 13.3.2 通过InnoDB使用事务 13.4 外键 13.5 存储过程...

    PHP和MySQL Web开发第4版

    12.7.3 设置一个/多个从服务器 12.8 进一步学习 12.9 下一章 第13章 MySQL高级编程 13.1 LOAD DATA INFILE语句 13.2 存储引擎 13.3 事务 13.3.1 理解事务的定义 13.3.2 通过InnoDB使用事务 13.4 外键 ...

    华为编程开发规范与案例

    与开发人员在测试组环境多次重复以上步骤,发现11群的计次表话单有时正常,有时其出中继群号就为一个随机值,发生异常的频率比较高。为什么其它群的话单正常,唯独11群不正常呢?11群是四个群中最小的群,其中继计...

    UNIX 高级教程系统技术内幕

    15.5.1 一个网络共享内存服务器 15.6 页面替换 15.7 分析 15.8 4.4BSD 的内存管理 15.9 快表(TLB)一致性 15.9.1 单处理机上的TLB 一致性 15.9.2 多处理机问题 15.10 Mach 的TLB 击落算法 15.10.1 同步和死锁避免 ...

    网络驱动程序设计指南

    11.1.2 使用多个NIC的FFP 170 11.1.3 IP转发 171 11.1.4 FFP和包过滤 171 11.2 NIDS中的FFP支持 172 11.3 为IP转发在微端口实现FFP 172 第十二章 带WDM低级接口的微端口驱动程序 174 12.1 WDM低层微端口 174 12.2 ...

    TCP拦截和网络地址转换

    监视进来的T C P连接的同时,尽可能多地保留资源(见图.. 8 - 2)。 服务器 工作站 内部网络 客户路 由器 提供者的 路由器 拥有198.50.1.100目的地址的 报文被TCP拦截所监视 图8-2 网络方案:示例1 8.2.1 解决...

    win2000驱动程序设计指南

    快速转发路径 169 11.1 关于FFP 170 11.1.1 使用一个NIC的FFP 170 11.1.2 使用多个NIC的FFP 170 11.1.3 IP转发 171 11.1.4 FFP和包过滤 171 11.2 NIDS中的FFP支持 172 11.3 为IP转发在微端口...

Global site tag (gtag.js) - Google Analytics