PHP技术那点事
全部
技术
PHP
MySQL
前端
Linux
JAVA
退出
编辑文章
选择分类
PHP
MySQL
前端
Linux
Java
工具
选择专栏
设计模式
java基础
Angular学习
Java面试题
描述:
java CyclicBarrier
封面图上传 :
+
点击上传图片
#### 概念 cyclicBarrier的字面意思时可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法 ### 例子 收集七龙珠,只有七颗龙珠收齐了才能召唤神龙,没得到七颗之前,其他得到的龙珠只能先放好,等到七颗收起完成才能一起召唤 #### 代码实现 - new CyclicBarrier();第一个参数(即7)表示等待的线程数,第二个参数(即`()->{System.out.println("****集齐龙珠,召唤神龙****");}`)是达到7个后执行的方法,即构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务 - 线程调用 await() 表示自己已经到达栅栏 - BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时 ```java package com.bowen; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{ System.out.println("****集齐龙珠,召唤神龙****"); }); for (int i = 1; i <= 7; i++) { final int temp = i; new Thread(()->{ System.out.println("集到第"+temp+"颗龙珠"); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } },String.valueOf(i)).start(); } } } //结果 //集到第6颗龙珠 //集到第2颗龙珠 //集到第3颗龙珠 //集到第5颗龙珠 //集到第7颗龙珠 //集到第1颗龙珠 //集到第4颗龙珠 //****集齐龙珠,召唤神龙**** ```
保存文章