CyclicBarrier 使用
CyclicBarrier 同步屏障
和CountDownLatch类似
可循环使用的屏障,一组线程到达屏障时被阻塞,直到最后一个线程到达时,屏障才开门,所有被拦截的线程继续执行。
例如:
第一个娜扎先和贾冰约会
第二个热巴可以在家多睡3秒钟,等贾冰和娜扎约完了
第三个柳岩可以在家多睡6秒钟,等贾冰和热巴约完了
public class CyclicBarrierTest { private static String girl = "【娜扎】"; public static void main(String[] args) { //设置屏障等待数量为2个 CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> System.out.println("贾冰的约会对象是:" + girl)); //贾冰线程 Thread a1 = new Thread(() -> { try { //每次约会完休息3秒 show("等待第1个约会对象"); cyclicBarrier.await(); show("第1个约会太累,休息1秒======================"); Thread.sleep(1000); show("等待第2个约会对象"); girl = "【热巴】"; cyclicBarrier.await(); show("第2个约会太累,休息1秒======================"); Thread.sleep(1000); show("等待第3个约会对象"); girl = "【柳岩】"; cyclicBarrier.await(); show("第3个约会太累,暂停营业,回家休息======================"); Thread.sleep(1000); } catch (Exception e) { throw new RuntimeException(e); } }, "贾冰"); //娜扎线程 Thread a2 = new Thread(() -> { try { show("贾哥哥久等了"); cyclicBarrier.await(); } catch (Exception e) { throw new RuntimeException(e); } }, "娜扎"); //热巴线程 Thread a3 = new Thread(() -> { try { show("睡个懒觉3秒"); Thread.sleep(3000); show("贾哥哥久等了"); cyclicBarrier.await(); } catch (Exception e) { throw new RuntimeException(e); } }, "热巴"); //柳岩线程 Thread a4 = new Thread(() -> { try { show("睡个懒觉6秒"); Thread.sleep(6000); show("贾哥哥久等了"); cyclicBarrier.await(); } catch (Exception e) { throw new RuntimeException(e); } }, "柳岩"); a1.start(); a2.start(); a3.start(); a4.start(); } //加线程名称显示信息 private static void show(String s) { System.out.println(Thread.currentThread().getName() + ":" + s); } }
输出结果:
贾冰:等待第1个约会对象 柳岩:睡个懒觉6秒 热巴:睡个懒觉3秒 娜扎:贾哥哥久等了 贾冰的约会对象是:【娜扎】 贾冰:第1个约会太累,休息1秒====================== 贾冰:等待第2个约会对象 热巴:贾哥哥久等了 贾冰的约会对象是:【热巴】 贾冰:第2个约会太累,休息1秒====================== 贾冰:等待第3个约会对象 柳岩:贾哥哥久等了 贾冰的约会对象是:【柳岩】 贾冰:第3个约会太累,暂停营业,回家休息======================
核心方法:
方法 | 功能 |
---|---|
await() | 等待计数为0 |
等待计数为0,或者超时 |