前言:
CountDownLatch是Java并发编程很好用的一个tools,其作用是主线程等待子线程都完成后主线程才开始执行,比如说可以用来
计算子线程任务完成后共耗时多少,或者一个游戏场景所有玩家准备后主线程才开始游戏等等
CountDownLatch的功能和Future的get()方法类似,只有任务完成了才返回,不然一直阻塞.
CountDownLatch内部有个计数器,在新建这个闭锁的时候构造参数传入,每当调用countDown方法,计数减一,
当在主线程调用await方法的时候会一直阻塞到计数器为0,注意当计数器为0后,不能再循环利用这个闭锁.
实战:
/**计算子线程耗时
* @author m969130721@163.com
* @date 18-6-13 下午6:13
*/
public class Demo {
public static void main(String[] args) throws InterruptedException {
Instant start = Instant.now();
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(new MyThread(countDownLatch)).start();
}
//阻塞直到计数器为0
countDownLatch.await();
// countDownLatch.await(10,TimeUnit.SECONDS);最多等待10秒,执行下面操作
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
}
class MyThread implements Runnable {
private CountDownLatch countDownLatch;
public MyThread(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
}
结果: