* 同步计数器
* 作用:同步N个线程执行
* 1 一个问题分为N个部分一起执行,执行完毕然后汇总
* @author root
*
* 场景设想:
* 有10个沙包,10个人来运送
* 当每人都运送完毕,则整个运送完毕
public class CountDownLatchTest2 {
public static void main(String[] args) {
//所有线程执行完毕标识
CountDownLatch allEndFlag = new CountDownLatch(10);
try {
for(int i=0;i<10;i++){
Thread.sleep(500);//利用sleep,说明工人开始时间不同
SlaveThread2 worker = new SlaveThread2( allEndFlag,i);
worker.start();
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
allEndFlag.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主任务完成。。");
}
}
//工人类
class SlaveThread2 extends Thread{
//工人编号
private Integer number ;
//当前工人用力完毕 则减一
private CountDownLatch allEndFlag;
public SlaveThread2( CountDownLatch allEndFlag , int number){
this.number = number ;
this.allEndFlag = allEndFlag ;
}
@Override
public void run() {
long start = System.currentTimeMillis() ;
System.out.println( "工人+"+number+"起止时间"+start);
takeUp() ;
//当前工人用力完毕,结束
allEndFlag.countDown();
System.out.println( "工人"+number+"完成");
}
//抬起
public void takeUp(){
try {
//抬起箱子总共花费时间 3s
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}