一、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方法的处理逻辑除了一直等待到最后一个线程到达之外还有其他情况会终止线程的等待:

  1. 最后一个线程到达,即index == 0

  2. 超出了指定时间(超时等待)

  3. 其他的某个线程中断当前线程

  4. 其他的某个线程中断另一个等待的线程

  5. 其他的某个线程在等待barrier超时

  6. 其他的某个线程在此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工具类的更多相关文章

  1. Java并发之同步工具类

    1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...

  2. Java并发之CountDownLatch工具类

    一.CountDownLatch工具类介绍 CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作.假设我们有这样的一 ...

  3. Java并发多线程 - 并发工具类JUC

    安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...

  4. Java 中的并发工具类

    Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...

  5. Java线程的并发工具类

    Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...

  6. Rhino+envjs-1.2.js 在java运行网站js 工具类

    java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...

  7. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

  8. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  9. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

随机推荐

  1. 【翻译】使用Sencha Touch开发Google Glass应用程序

    原文:Developing for Google Glass with Sencha Touch 作者:Ross Gerbasi Ross Gerbasi is a Senior Engineer a ...

  2. STM32F429学习笔记(一)触屏工程Keil建立

    由于原来的STM32F103ZET6的flash坏掉了,所以又买了一块STM32F429DISCOVERY,这块板子非常不错,基于Cortex-M4内核,自带一块2.4寸TFT触屏,主频为180M,且 ...

  3. BDA大数据处理流程

    可以看出,数据处理用云,可以高效完成.而分析部分应该利用传统的bi工具.

  4. unity 球体表面平均分割点

    之前看了别人的一份源码,讲到了球体表面平均分割点,于是也好奇去查了一下算法,自己写不出来,借用算法在unity写了一个小demo using UnityEngine; using System.Col ...

  5. Nginx使用图片处理模块

    Nginx可以编写很多额外的模块,这里我们需要按照能够通过URL响应返回缩放且含图片水印功能的模块. 1.安装一些使用过程中会用到的工具 yum install libgd2-devel yum in ...

  6. Eclipse常见设置

    当新建一个workspace时,习惯做下面的设置: 1. 在eclipse中,默认的Text file encoding是GBK(操作系统是中文简体):如果操作系统是中文繁体,默认是MS950(Big ...

  7. JS基础速成(三)- DOM(文件对象模型)

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.DOM树的基本结构 DOM节点分为三大类:元素节点(标签节点),属性节 ...

  8. Word Break(动态规划)

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  9. spring:org.springframework.web.servlet.DispatcherServlet noHandlerFound解决方法

    1.搜了许久: <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern& ...

  10. 微软云消息队列 Azure service bus queue

    前言 第一次使用消息队列,遇到了一些问题:同一个消息有多次出列.是一个消息只入列一次,还是多次?还是因为出列问题,出列了多次? Microsoft Azure service bus queue Az ...