CyclicBarrier的小例子

干饭人来展示如何使用CyclicBarrier

Posted by Jeremy Song on 2022-07-09
Estimated Reading Time 1 Minutes
Words 356 In Total
Viewed Times

简介&场景

假如有若干个线程,当多个线程都达到某一个点之后才能开始时就可以使用CyclicBarrier来实现。

有这么一个虚拟的场景:

有一群小伙伴去吃饭,能去吃饭的地有个小板车,班车每次坐满三人发车。假如没有坐满三人,十秒后发车。

下面就看看我们怎么来实现。

编码示例

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
37
38
39
40
41
42
43
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Solver {
public static void main(String[] args) throws Exception {
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("Action done"));
for (int i = 1; i <= 10; i++) {
Thread thread = new Thread(new Worker(i, barrier));
thread.start();
}

Thread.sleep(1000L * 2);
System.out.println("下雨了~");
}

private static class Worker implements Runnable {
public Worker(int i, CyclicBarrier barrier) {
this.i = i;
this.barrier = barrier;
}

int i;
CyclicBarrier barrier;

@Override
public void run() {
try {
System.out.printf("%d出发了!%n", i);
Thread.sleep(new Random((long) (Math.random() * Integer.MAX_VALUE)).nextLong(1000 * 10));
System.out.printf("%d完成了!%n", i);
barrier.await(10L, TimeUnit.SECONDS);
System.out.printf("%d去吃饭了!%n", i);
} catch (TimeoutException e) {
System.out.printf("不等了,%d去吃饭了!%n", i);
} catch (Exception e) {
e.printStackTrace();
}
}
}

}

最后

CyclicBarrierCountDownLatch 很类似,当然就像其名字一样,CyclicBarrier 是可以循环使用的。



欢迎关注我的公众号 须弥零一,跟我一起学习IT知识。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !