Java并发之CyclicBarrier工具类
一、CyclicBarrier工具类介绍
在上一篇文中我们介绍到了CountDownLatch工具类,其实CyclicBarrier和CountDownLatch工具类实现的功能差不多。我们可以从字面上理解CyclicBarrier意思就是可以循环使用的屏障。该工具类可以做到让一组线程到达一个屏障点的时候被阻塞,直到最后一个线程到达才开启屏障,继续往下执行。CyclicBarrier默认的构造方法是一个CyclicBarrier(int parties)。参数parties表示屏障需要拦截的线程数量。每个线程都会去调用await()方法通知道CyclicBarrier我已经到达屏障了。然后当前这个线程被阻塞,一直到所有的线程都到达屏障。另外CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties,Runnable barrier-Action),用于在线程到达屏障时,优先执行barrierAction中的业务代码,方便处理更复杂的业务场景需求。
场景使用:Boss要开会,会议需要等到N个人到齐才能够正常进行开展。这个场景中就适合使用CyclicBarrier工具类。
1
2 import java.io.IOException;
3 import java.util.concurrent.BrokenBarrierException;
4 import java.util.concurrent.CyclicBarrier;
5 import java.util.concurrent.ExecutorService;
6 import java.util.concurrent.Executors;
7
8 public class CyclicBarrierUserCase {
9
10 public static void main(String[] args) throws IOException, InterruptedException {
11
12 CyclicBarrier barrier = new CyclicBarrier(5,new Runnable() {
13 @Override
14 public void run() {
15 System.out.println(" 开会了,996工作要开始了!");
16 }
17 });
18
19 ExecutorService executor = Executors.newFixedThreadPool(5);
20 executor.submit(new Thread(new Worker(barrier, "项目经理")));
21 executor.submit(new Thread(new Worker(barrier, "产品经理")));
22 executor.submit(new Thread(new Worker(barrier, "程序员1号")));
23 executor.submit(new Thread(new Worker(barrier, "程序员2号")));
24 executor.submit(new Thread(new Worker(barrier, "程序员3号")));
25 executor.shutdown();
26
27 }
28
29
30
31 }
32 class Worker implements Runnable{
33 // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
34 private CyclicBarrier barrier;
35 private String name;
36
37 public Worker(CyclicBarrier barrier,String name){
38 this.barrier = barrier;
39 this.name = name;
40 }
41
42 @Override
43 public void run() {
44 try{
45 System.out.println(name + " 准备好了...");
46 // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
47 barrier.await();
48 }catch (InterruptedException e) {
49 e.printStackTrace();
50 } catch (BrokenBarrierException e) {
51 e.printStackTrace();
52 }
53 }
54 }
1 项目经理 准备好了...
2 程序员1号 准备好了...
3 程序员2号 准备好了...
4 程序员3号 准备好了...
5 产品经理 准备好了...
6 开会了,996工作要开始了!
其实await方法的处理逻辑除了一直等待到最后一个线程到达之外还有其他情况会终止线程的等待:
最后一个线程到达,即index == 0
超出了指定时间(超时等待)
其他的某个线程中断当前线程
其他的某个线程中断另一个等待的线程
其他的某个线程在等待barrier超时
其他的某个线程在此barrier调用reset()方法。reset()方法用于将屏障重置为初始状态。
二、CyclicBarrier和CountDownLatch的比较
1. CountDownLatch计数器不可以复用,即计数器使用以后不能够重置,但是CyclicBarrier可以调用reset()重置。当计算任务失败的时候可以重新计算。
2. CyclicBarrier提供了更多的方法例如getNumberWaiting方法可以获得Cyclic-Barrier 阻塞的线程数量。isBroken()方法用来了解阻塞的线程是否被中断。
3. CountDownLatch计数器是通过调用countDown()方法进行减一计算,调用await()方法只进行阻塞,对计数没任何影响。CyclicBarrier是通过调用await()方法进行加1运算。若加1后的值不等于构造方法的值,则线程阻塞。
Java并发之CyclicBarrier工具类的更多相关文章
- Java并发之同步工具类
1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...
- Java并发之CountDownLatch工具类
一.CountDownLatch工具类介绍 CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作.假设我们有这样的一 ...
- Java并发多线程 - 并发工具类JUC
安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
- Java线程的并发工具类
Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...
- Rhino+envjs-1.2.js 在java运行网站js 工具类
java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
随机推荐
- 关于学习MMU的一点感想
MMU的一个主要服务是能把各个人物作为各自独立的程序在其自己的虚拟存储空间中运行. 虚拟存储器系统的一个重要特征是地址重定位.地址重定位是将处理器核产生的地址转换到主存的不同地址,转换由MMU硬件完成 ...
- Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高!
Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高! 群英传的最后一章,我大致的看了一下这个例子,发现鸿洋大神也做过,就参考两个人的设计逻辑,感觉都差不多,就这样实现起来了 ...
- SpartanBrowser产品和安全特性简介
v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...
- Android Preference详解
转载请标明出处:ttp://blog.csdn.net/sk719887916/article/details/42437253 Preference 用来管理应用程序的偏好设置和保证使用这些的每个应 ...
- TCP浅谈为什么3次握手
<计算机网络>中的例子是这样的,"已失效的连接请求报文段"的产生在这样一种情况:客户发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连 ...
- How--to-deploy-smart-contracts-on
The following smart contract code is only an example and is NOT to be used in Production systems. pr ...
- package.json字段全解
原文:http://blog.csdn.net/woxueliuyun/article/details/39294375 Name 必须字段. 小提示: 不要在name中包含js, node字样: 这 ...
- Java反射之修改常量值
1. 通过反射修改常量的值 package com.blueStarWei.invoke; import java.lang.reflect.Field; public class ModifyFin ...
- Day7 类的继承和继承实现的原理
继承可以分为但继承,多继承. 继承的基本形式 class ParentClass1(object): #定义父类 pass class ParentClass2: #定义父类 pass class S ...
- 利用XShell上传、下载文件(使用sz与rz命令),超实用!
借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. 其中,对于sz和rz的理解与记忆我用了如下的方法(很多时候容易搞混): sz中 ...