个人理解为倒计数锁,让一个或几个线程等待另外一个或几个线程执行完毕,才继续执行
如10个子线程执行完毕,主线程才能执行等等吧
下面提供两个例子来说明具体使用:
1 同步计数器
/**
* 同步计数器
* 作用:同步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]