编写一个示例程序,展示如何使用 CountDownLatch 类进行多线程同步和协作。
以下是一个示例程序,展示如何使用 CountDownLatch
类来进行多线程同步和协作:
示例程序:使用 CountDownLatch
等待多个线程完成任务
场景描述:
主线程需要等待多个工作线程完成各自的任务后,继续执行。例如,在一个比赛中,需要等所有选手准备好后,裁判才发出开始信号。
代码实现
程序输出(示例)
输出顺序可能因线程调度不同而变化:
Main thread is waiting for workers to finish...
Worker 1 is working...
Worker 2 is working...
Worker 3 is working...
Worker 2 has finished.
Worker 1 has finished.
Worker 3 has finished.
All workers have finished. Main thread resumes.
代码解析
CountDownLatch
初始化:CountDownLatch latch = new CountDownLatch(3);
- 创建一个
CountDownLatch
,初始计数器值为3
,表示需要等待 3 个任务完成。
- 工作线程的任务:
- 每个工作线程模拟执行某些任务(通过
Thread.sleep
模拟耗时操作)。 - 执行完任务后调用
latch.countDown()
,将计数器减 1。
- 每个工作线程模拟执行某些任务(通过
- 主线程等待:
latch.await();
会阻塞主线程,直到计数器值变为 0。
- 工作线程完成后继续主线程:
- 当计数器值为 0 时,
await()
方法返回,主线程继续执行。
- 当计数器值为 0 时,
扩展:并行任务的启动和同步
我们也可以使用 CountDownLatch
控制多个线程同时启动。例如,模拟多个线程同时启动任务(如多个跑步选手听到发令枪声同时开始比赛)。
程序输出(示例)
输出顺序可能因线程调度不同而变化:
Runner 1 is ready...
Runner 2 is ready...
Runner 3 is ready...
Ready... Set... Go!
Runner 1 started running!
Runner 3 started running!
Runner 2 started running!
Runner 3 finished!
Runner 1 finished!
Runner 2 finished!
All runners have finished the race!
总结
- CountDownLatch是一个很好的多线程同步工具,可以用于:
- 主线程等待多个子线程完成任务。
- 控制多个线程同时启动。
- 核心方法:
countDown()
:让计数器减 1。await()
:阻塞线程,直到计数器为 0。
- 适合使用场景:
- 并行任务的启动和同步。
- 主线程等待子线程完成任务。
- 模拟比赛等需要同步的场景。