CountDownLatch1

 

       个人理解为倒计数锁,让一个或几个线程等待另外一个或几个线程执行完毕,才继续执行

如10个子线程执行完毕,主线程才能执行等等吧

  

下面提供两个例子来说明具体使用: 

同步计数器 

/**

 * 同步计数器 

 * 作用:同步N个线程执行

 * 1 让所有线程同一时间开始执行 

 * 2 主线程等待所有子线程执行完毕,才能结束 

 * @author root

 * 

 * 场景设想:

 *  不同时间招来10个工人(创建并开启10个线程,但时间各不相同)

 *  一起搬运一个大箱子(10个线程在执行搬运方法是同时的),

 *  大家必须统一时间用力,才能保证搬运的协调

 *  运送到目的地后,当所有人把箱子放下,则整个搬运结束 (主线程等待所有子线程结束,才结束)

 */

代码:

  

public class CountDownLatchTest {

	public static void main(String[] args) {
		//工人用力同步标识,工人准备结束,则一同开始
		CountDownLatch startFlag = new CountDownLatch(1);
		//所有线程执行完毕标识
		CountDownLatch allEndFlag = new CountDownLatch(10);
		try {
			for(int i=0;i<10;i++){
				Thread.sleep(500);//利用sleep 可以说明 工人来到工地的时间是不同的 
				SlaveThread worker =  new SlaveThread(startFlag,allEndFlag,i);
				worker.start();
			}
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		startFlag.countDown(); //标识主线程通知子线程 工人准备完毕,可以开始用力 
		
		try {
			allEndFlag.await();
			System.out.println();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} 
		System.out.println("主任务完成。。");
	}
}
//工人类
class SlaveThread  extends Thread{
	//工人编号
	private Integer number ; 
	//线程开始标识
	private CountDownLatch startFlag;
	//当前工人用力完毕 则减一
	private CountDownLatch allEndFlag;
	
	public SlaveThread(CountDownLatch startFlag,CountDownLatch allEndFlag ,  int number){
		this.number = number ;
		this.startFlag = startFlag ; 
		this.allEndFlag = allEndFlag ; 
	}
	
	@Override
	public void run() {
		
		try {
			startFlag.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		long start = System.currentTimeMillis() ; 
		
		System.out.println( "工人+"+number+"起止时间"+start+Thread.currentThread());
		takeUp() ;
		
		//当前工人用力完毕,结束
		allEndFlag.countDown(); 
		System.out.println( "工人"+number+"完成");
	}
	
	//抬起
	public void takeUp(){
		try {
			//抬起箱子总共花费时间 3s
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 执行结果:理想情况下10个工人线程起止时间应该相同,但是总有几毫秒的差异,

                 个人猜想可能是因为机器不能同时执行10个线程吧

                  在网上找了一下,机器同时执行的线程数少于等于cpu数目。

 

工人+9起止时间1440488675796Thread[Thread-9,5,main]
工人+1起止时间1440488675796Thread[Thread-1,5,main]
工人+3起止时间1440488675796Thread[Thread-3,5,main]
工人+6起止时间1440488675796Thread[Thread-6,5,main]
工人+2起止时间1440488675796Thread[Thread-2,5,main]
工人+5起止时间1440488675796Thread[Thread-5,5,main]
工人+4起止时间1440488675796Thread[Thread-4,5,main]
工人+7起止时间1440488675797Thread[Thread-7,5,main]
工人+8起止时间1440488675797Thread[Thread-8,5,main]
工人+0起止时间1440488675796Thread[Thread-0,5,main]

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值