CountDownLatch的使用

57 阅读1分钟

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使用起来较为灵活。

引用:zhuanlan.zhihu.com/p/692058180