《黑马程序员》 并发中的CountDownLatch同步工具类

public class CountDownLatchDemo2 {
	/**
	 * CountDownLatch:
	 *   以3个小组的比赛来进行分析:
	 *     指令员发令。它有一个计数器。计时使用。这个是为了统一
	 *     运行员在指令员的计数器到0之后接受到指令
	 *     每个运动员都有一个计数器。每个运动员在到达终点之后把
	 *     对应的计数器给置为0.这样指令员才能进行下一步的操作。
              
             倒计数的记时器
               它有一个初始值,我们可以调用CountDownLatch的countDown方法将计数器的值减1,
            当计数器到达0时,则所有等待者或单个等待者开始执行。
              比如赛跑的时候,发令员发令之前,所有的运动员都在等待发令员的发令,而发令员的
            时间也是从10---0的。这也是一个计数器。到0之后,所有运动员快速冲向目标。
            一个人通知多个人
            多个人通知一个人 */
	public static void main(String[] args) {
		ExecutorService pool=Executors.newCachedThreadPool();
		final CountDownLatch cd1=new CountDownLatch(1);  //指令员所用的计数器
		final CountDownLatch cd2=new CountDownLatch(3);  //运动员所使用的计数器
		String str="线程:"+Thread.currentThread().getName();
		for(int i=0;i<3;i++){
			Runnable run=new Runnable() {
				
				@Override
				public void run() {
					try{
						String str="线程:"+Thread.currentThread().getName();
						System.out.println(str+"正在接受指令");
						cd1.await();  //让它处于等待的状态
						System.out.println(str+"接受到指令,出发.....");
						Thread.sleep((long)(Math.random()*10000));
						System.out.println(str+"已经到达终点");
						cd2.countDown();
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			};
			pool.execute(run);
		}
		
		try{
			Thread.sleep((long)(Math.random()*10000));
			System.out.println(str+"正准备下达指令");
			cd1.countDown();  //把第一个计数器-1
			System.out.println(str+"已下达指令");
			cd2.await();
			System.out.println(str+"收到结果,正在裁判");
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	/**
	 *  线程:pool-1-thread-1正在接受指令
		线程:pool-1-thread-3正在接受指令
		线程:pool-1-thread-2正在接受指令
		线程:main正准备下达指令
		线程:main已下达指令
		线程:pool-1-thread-1接受到指令,出发.....
		线程:pool-1-thread-3接受到指令,出发.....
		线程:pool-1-thread-2接受到指令,出发.....
		线程:pool-1-thread-2已经到达终点
		线程:pool-1-thread-3已经到达终点
		线程:pool-1-thread-1已经到达终点
		线程:main收到结果,正在裁判
	 */
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值