JUC工具类之CyclicBarrier
# 简介
对于CountDownLatch,其他线程为游戏玩家,比如英雄联盟,主线程为控制游戏开始的线程。在所有的玩家都准备好之前,主线程是处于等待状态的,也就是游戏不能开始。当所有的玩家准备好之后,下一步的动作实施者为主线程,即开始游戏。
对于CyclicBarrier,假设有一家公司要全体员工进行团建活动,活动内容为翻越三个障碍物,每一个人翻越障碍物所用的时间是不一样的。但是公司要求所有人在翻越当前障碍物之后再开始翻越下一个障碍物,也就是所有人翻越第一个障碍物之后,才开始翻越第二个,以此类推。类比地,每一个员工都是一个“其他线程”。当所有人都翻越的所有的障碍物之后,程序才结束。而主线程可能早就结束了,这里我们不用管主线程。
# 例子
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
static class MyThread extends Thread {
private CyclicBarrier cb;
public MyThread(String name, CyclicBarrier cb) {
super(name);
this.cb = cb;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "第一步");
cb.await();
System.out.println(Thread.currentThread().getName() + "第二步");
cb.await();
System.out.println(Thread.currentThread().getName() + "结束");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(2, () -> {
System.out.println("进入下一阶段");
});
for (int i = 0; i < 2; i++) {
new MyThread("thread-" + i, cb).start();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
其中一次输出:
thread-0第一步
thread-1第一步
进入下一阶段
thread-1第二步
thread-0第二步
进入下一阶段
thread-0结束
thread-1结束
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 和CountDonwLatch对比
- CountDownLatch减计数,CyclicBarrier加计数。
- CountDownLatch是一次性的,CyclicBarrier可以重用。
- CountDownLatch和CyclicBarrier都有让多个线程等待同步然后再开始下一步动作的意思,但是Coun tDownLatch的下一步的动作实施者是主线程,具有不可重复性;而CyclicBarrier的下一步动作实施者还是“其他线程”本身,具有往复多次实施动作的特点。
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11