全部
技术
PHP
MySQL
前端
Linux
JAVA
工具
纪念日计算器
邮记星
个人记账
笔记侠
历史上的今天
生日密码
生日书
生日密码
生日花语
博古通今
三十六计
鬼谷子
笑林广记
本草纲目
山海经
唐诗宋词
宋词300首
唐诗300首
退出
登录
注册
编辑文章
选择分类
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颗龙珠 //****集齐龙珠,召唤神龙**** ```
保存文章