简介&场景
假如有若干个线程,当多个线程都达到某一个点之后才能开始时就可以使用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(); } } }
}
|
最后
CyclicBarrier
和 CountDownLatch
很类似,当然就像其名字一样,CyclicBarrier
是可以循环使用的。
欢迎关注我的公众号 须弥零一,跟我一起学习IT知识。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !