一、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. 【一天一道LeetCode】#48. Rotate Image

    一天一道LeetCode系列 (一)题目 You are given an n x n 2D matrix representing an image. Rotate the image by 90 ...

  2. JAVA中IO流总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

  3. Protobuf-java maven配置

    Protobuf-java maven配置 1. maven pom片断 <!-- protobuf-java for maven plugin http://stackoverflow.com ...

  4. android开发性能分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  5. 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战

    发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...

  6. Linux常用命令(第二版) --网络通信命令

    网络通信命令 1.write /usr/bin/write 格式: write [用户名] #用于向用户发送信息,前提是这个用户已经登录到了这台服务器主机,不然的话,也没有办法给他留言,所以,writ ...

  7. XMPP系列(一):OpenFire环境搭建

    XMPP的服务器可以用OpenFire.ejabberd.jabberd2.x.Prosody.Tigase,其中比较常用的是OpenFire和ejabberd,还可以自己写服务器,我们公司的服务器端 ...

  8. How to Send an Email Using UTL_SMTP with Authenticated Mail Server

    In this Document   Goal   Solution   References APPLIES TO: PL/SQL - Version 9.2.0.1 to 12.1.0.1 [Re ...

  9. 对于CocoaPods的简单理解,实践安装使用过程和常见问题

    (本文是自己通过其他文章进行的自我编辑和简单修改,请大家凑活看看) 一.什么是CocoaPods CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理.开发iOS项目不可避免地 ...

  10. LeetCode(56)-Add Binary

    题目: Given two binary strings, return their sum (also a binary string). For example, a = "11&quo ...