工作过程
一个线程等待线其他线程处理完所有调度作业后,合并计算之后计数归零才会往下执行,否则抛出中断异常并且堵塞。
适用于:并发任务调度处理,调度任务之间并发执行。
Executor executor = Executors.newFixedThreadPool(2);
CountDownLatch latch = new CountDownLatch(2); //创建计数器为2的CountDownLatch
executor.execute(()-> {
//...业务1
latch.countDown(); //完成业务1后,计数器-1
});
executor.execute(()-> {
//...业务2
latch.countDown(); //完成业务2后,计数器再-1,
});
//主线程等待线程池调度完所有任务(业务1和业务2)后才可以往下执行。
//线程池在处理业务调度过程中其实是被挂起的,计数器清零时候才会被唤醒。
latch.await();
缺点:并发任务调度处理业务过程中,计数器没有-1的情况。
latch.countDown(); 需要异常处理,在finally之后必须保证计数器-1,这样线程不管是否异常都可以保证计数器及时-1