JAVA并发工具类---------------(CyclicBarrier)
CyclicBarrier简介CyclicBarrier,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。 所谓Cyclic即 循环 的意思,所谓Barrier即 屏障 的意思。 所以综合起来,CyclicBarrier指的就是 循环屏障,虽然这个叫法很奇怪,但是确能很好地表示它的作用。 CyclicBarrier方法说明——CyclicBarrier(parties) 初始化相互等待的线程数量的构造方法。 ——CyclicBarrier(parties,Runnable barrierAction) 初始化相互等待的线程数量以及屏障线程的构造方法。 屏障线程的运行时机:等待的线程数量=parties之后,CyclicBarrier打开屏障之前。 举例:在分组计算中,每个线程负责一部分计算,最终这些线程计算结束之后,交由屏障线程进行汇总计算。 ——getParties() 获取CyclicBarrier打开屏障的线程数量,也成为方数。 ——getNumberWaiting() 获取正在CyclicBarrier上等待的线程数量。 ——await() 在CyclicBarrier上进行阻塞等待,直到发生以下情形之一:
——await(timeout,TimeUnit) 在CyclicBarrier上进行限时的阻塞等待,直到发生以下情形之一:
——isBroken() 获取是否破损标志位broken的值,此值有以下几种情况:
——reset() 使得CyclicBarrier回归初始状态,直观来看它做了两件事:
? CyclicBarrier方法练习主线程 package CyclicBarrierTest; import javafx.concurrent.Worker; import java.util.concurrent.CyclicBarrier; /** * @Description: * @Param: * @return: 一个会议要等10个人都在的时候才能开始开 * @Date: 2019/9/17 */ public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier=new CyclicBarrier(10); for (int i = 0; i < 10; i++) { System.out.println("开始进场" + i); People people = new People(cyclicBarrier); new Thread(people).start(); } } } ? 人员类 package CyclicBarrierTest; import java.util.concurrent.CyclicBarrier; public class People implements Runnable { private CyclicBarrier cyclicBarrier; public People(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { try { System.out.println(Thread.currentThread().getName() + "进成功开始等待其他人,当前有"+cyclicBarrier.getNumberWaiting()+"人在等待"); cyclicBarrier.await(); System.out.println(Thread.currentThread().getName() + "开始开会"); // 工作线程开始处理,这里用Thread.sleep()来模拟业务处理 Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + "开会完毕"); } catch (Exception e) { e.printStackTrace(); } } } ? 执行结果 D:javajdk1.8binjava.exe "-javaagent:D:ideaaIntelliJ IDEA 2018.1.2libidea_rt.jar=57236:D:ideaaIntelliJ IDEA 2018.1.2bin" -Dfile.encoding=UTF-8 -classpath D:javajdk1.8jrelibcharsets.jar;D:javajdk1.8jrelibdeploy.jar;D:javajdk1.8jrelibextaccess-bridge-32.jar;D:javajdk1.8jrelibextcldrdata.jar;D:javajdk1.8jrelibextdnsns.jar;D:javajdk1.8jrelibextjaccess.jar;D:javajdk1.8jrelibextjfxrt.jar;D:javajdk1.8jrelibextlocaledata.jar;D:javajdk1.8jrelibextnashorn.jar;D:javajdk1.8jrelibextsunec.jar;D:javajdk1.8jrelibextsunjce_provider.jar;D:javajdk1.8jrelibextsunmscapi.jar;D:javajdk1.8jrelibextsunpkcs11.jar;D:javajdk1.8jrelibextzipfs.jar;D:javajdk1.8jrelibjavaws.jar;D:javajdk1.8jrelibjce.jar;D:javajdk1.8jrelibjfr.jar;D:javajdk1.8jrelibjfxswt.jar;D:javajdk1.8jrelibjsse.jar;D:javajdk1.8jrelibmanagement-agent.jar;D:javajdk1.8jrelibplugin.jar;D:javajdk1.8jrelibresources.jar;D:javajdk1.8jrelibrt.jar;E:gyftargetclasses CyclicBarrierTest.CyclicBarrierDemo 开始进场0 开始进场1 开始进场2 开始进场3 开始进场4 开始进场5 开始进场6 开始进场7 开始进场8 开始进场9 Thread-0进成功开始等待其他人,当前有0人在等待 Thread-4进成功开始等待其他人,当前有1人在等待 Thread-8进成功开始等待其他人,当前有2人在等待 Thread-1进成功开始等待其他人,当前有3人在等待 Thread-5进成功开始等待其他人,当前有4人在等待 Thread-9进成功开始等待其他人,当前有5人在等待 Thread-3进成功开始等待其他人,当前有6人在等待 Thread-7进成功开始等待其他人,当前有7人在等待 Thread-2进成功开始等待其他人,当前有8人在等待 Thread-6进成功开始等待其他人,当前有9人在等待 Thread-6开始开会 Thread-0开始开会 Thread-4开始开会 Thread-8开始开会 Thread-1开始开会 Thread-5开始开会 Thread-9开始开会 Thread-3开始开会 Thread-7开始开会 Thread-2开始开会 Thread-6开会完毕 Thread-7开会完毕 Thread-2开会完毕 Thread-4开会完毕 Thread-0开会完毕 Thread-3开会完毕 Thread-5开会完毕 Thread-8开会完毕 Thread-9开会完毕 Thread-1开会完毕 Process finished with exit code 0 ? 上面是模拟10个人一起开会的情况,当第一个线程到最后第一个线程开始执行后,都会等待后续线程到达cyclicBarrier.await()时会停驶当前线程的任务,当所有线程执行到await时,并行开始进行下一布任务 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |