今天碰到了个比较棘手的问题,就是存在有几个运行缓慢的任务,需要分线程同时处理来稍微提升一些速度,但是这一个事物必须要等这些线程全部执行完获取到相应的数据后才能执行下一步,所以就引出了今天要提的一个东西CountDownLatch,通过它就能实现上述场景
下面是部分代码实现:
//创建一个核心线程数为4的线程池
ExecutorService executorService = new ThreadPoolExecutor(4, 10,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(10));
CountDownLatch latch = new CountDownLatch(4);
executorService.execute(() -> {
//第一个子任务
latch.countDown();
}
executorService.execute(() -> {
//第二个子任务
latch.countDown();
}
executorService.execute(() -> {
//第三个子任务
latch.countDown();
}
executorService.execute(() -> {
//第四个子任务
latch.countDown();
}
//关闭线程池
executorService.shutdown();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 主任务
CountDownLatch是通过一个计数器来实现的,计数器的初始值是线程的数量(就是代码中的那个4)。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,此时被锁上的主线程就可以被唤醒恢复工作了。
通过上述代码就能完成,主任务等子任务完成后再执行的场景,当然要记得关线程池哦~~