1.介绍
CountDownLatch是一个同步协助的类,在多线程中允许多个线程等待,直到这些线程执行完成对CountDownLatch操作后的结果集。
2.过程
CountDownLatch利用计数值(count)来初始化对象,对应的await方法用于阻塞主线程的执行,直到count值递减到0时,await才会释放阻塞使主线程继续往下执行下去。计数值count的递减通过countDown方法进行单步数的递减。
3.使用
/**
* 所有子线程执行完毕后,主线程才能继续执行
*/
@Test
public void test02() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
threadPoolExecutor.execute(()->{
try{
System.out.println("线程:" + Thread.currentThread().getName() + " 执行完毕");
}catch (Exception e){
e.printStackTrace();
}finally {
countDownLatch.countDown();
}
});
System.out.println("第" + i + "个线程");
}
countDownLatch.await();
System.out.println("完成");
}
引申:CountDownLatch和Thread.join的区别
1、CountDownLatch的作用就是允许一个或多个线程等待其他线程完成操作,看起来有点类似join() 方法,但CountDownLatch比 join() 更加灵活,因为join方法需要线程Thread调用,而在项目中都避免直接操作线程,而是使用线程池来管理线程,这时候就没有办法直接调用这些线程的join方法了,这个时候就需要使用CountDownLatch了。 2、CountDownLatch可以手动控制在n个线程里调用n次countDown()方法使计数器进行减一操作,也可以在一个线程里调用n次执行减一操作。 而 join() 的实现原理是不停检查join线程是否存活,如果 join 线程存活则让当前线程永远等待。所以两者之间相对来说还是CountDownLatch使用起来较为灵活。