如何使用CountDownLatch实现多线程的同步
业务需求
- 一个整体的业务可以分为三个执行逻辑 业务A 业务B和业务C,业务A,B直接没有关联,业务C一定要等业务A和B执行完毕后执行。
图解说明
- 如下图
代码案例
public static void main(String[] args) throws InterruptedException {
//创建线程池 线程池 池内有两个线程
Executor executor = Executors.newFixedThreadPool(2);
//创建计算器 计算器的默认值为2
CountDownLatch countDownLatch = new CountDownLatch(2);
executor.execute(() -> {
try {
//模拟执行业务
Thread.sleep(5000);
countDownLatch.countDown();
System.out.println("业务A执行完毕");
} catch (InterruptedException e) {
}
});
executor.execute(() -> {
try {
//模拟执行业务
Thread.sleep(2000);
countDownLatch.countDown();
System.out.println("业务B执行完毕");
} catch (InterruptedException e) {
}
});
//等待业务1 和 2 都完成
countDownLatch.await();
System.out.println("业务A 和 业务 B 都完成了开始执行业务C");
System.out.println("业务C执行完毕");
((ExecutorService) executor).shutdown();
}
}
控制台输出:
业务B执行完毕
业务A执行完毕
业务A 和 业务 B 都完成了开始执行业务C
业务C执行完毕