一、CountDownLatch
CountDownLatch可以理解为一个倒计时计数器,它允许一个或多个线程等待,直到其他线程完成操作。
通俗解释:就像运动会的百米赛跑,所有运动员(线程)在起跑线等待,裁判(主线程)鸣枪(countDown)后,所有运动员才能开始跑。
核心方法:
-
CountDownLatch(int count)
:构造函数,count为计数器的初始值 -
await()
:使当前线程等待,直到计数器减到0 -
countDown()
:计数器减1
示例代码:
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
// 模拟5个玩家加载游戏场景
int playerCount = 5;
CountDownLatch latch = new CountDownLatch(playerCount);
for (int i = 1; i <= playerCount; i++) {
new Thread(() -> {
try {
// 模拟加载时间
Thread.sleep((long) (Math.random() * 3000));
System.out.println(Thread.currentThread().getName() + " 加载完成");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); // 计数器减1
}
}, "玩家-" + i).start();
}
System.out.println("等待所有玩家加载完成...");
latch.await(); // 主线程等待
System.out.println("所有玩家加载完成,游戏开始!");
}
}
实际应用场景
-
多任务开始前的统一初始化
-
并行计算,等待所有计算完成
-
服务启动时等待所有组件加载完成
二、CyclicBarrier
CyclicBarrier让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,所有线程才会继续执行。
通俗解释:就像朋友聚餐,必须所有人都到齐了才能开始吃饭。
与CountDownLatch的区别:
-
CountDownLatch是一次性的,CyclicBarrier可重复使用
-
CountDownLatch主线程等待,CyclicBarrier是所有线程互相等待
-
CyclicBarrier可以在所有线程到达后执行一个回调(Runnable)
示例代码:
public clas