CountDownLatch是一个同步辅助类
主要方法是:
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
使用场景:
当一组操作tasks完成后,才能执行任务taskB,该组操作tasks可以并发完成,没有先后顺序,但是taskB必须在tasks都完成之后才能开始执行。
实现上述业务场景的方法是:
//多个任务
String[] str = uuids.split(",");
//开启线程池
final ExecutorService threadPool = Executors.newFixedThreadPool(str.length);
//同步辅助类
final CountDownLatch latch = new CountDownLatch(str.length);
//每个任务单独启线程处理
for (final String uuid : str) {
Runnable run = new Runnable() {
@Override
public void run() {
try {
//执行tasks中任务
} catch (Exception e) {
//异常情况
}finally {
//执行完一个任务,即倒数
latch.countDown();
}
}
};
//使用线程池来执行任务
threadPool.submit(run);
}
try {
//等待所有任务完成,所有线程都执行countDown()操作,直到任务数全部执行完
latch.await();
//开始执行taskB任务
//TODO exec taskB
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
threadPool.shutdown();
}