一、CyclicBarrier

  CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
  CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。

A、构造函数       创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在每个 barrier 上执行预定义的操作。

  1. public CyclicBarrier(int parties) { this(parties, null);}

demo:

  1. package com.jalja.org.thread;
  2. import java.util.concurrent.CyclicBarrier;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class LockTest {
  6. public static void main(String [] args){
  7. CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
  8. ExecutorService executorService= Executors.newFixedThreadPool(3);
  9. Runnable threadTest=null;
  10. for(int i=0;i<3;i++){
  11. threadTest=new ThreadTest(cyclicBarrier);
  12. executorService.execute(threadTest);
  13. }
  14. executorService.shutdown();
  15. }
  16. }
  17. class ThreadTest implements Runnable{
  18. private CyclicBarrier cyclicBarrier;
  19. public ThreadTest(CyclicBarrier cyclicBarrier){
  20. this.cyclicBarrier=cyclicBarrier;
  21. }
  22. public void run() {
  23. try {
  24. Thread.sleep((long)(Math.random()*10000));
  25. System.out.println(Thread.currentThread().getName()+"开始执行");
  26. cyclicBarrier.await();
  27. }catch (Exception e){
  28. e.printStackTrace();
  29. }
  30. System.out.println(Thread.currentThread().getName()+"执行结束");
  31. }
  32. }

B、构造函数      创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行

  1. public CyclicBarrier(int parties, Runnable barrierAction) {
  2. if (parties <= 0) throw new IllegalArgumentException();
  3. this.parties = parties;
  4. this.count = parties;
  5. this.barrierCommand = barrierAction;
  6. }

demo: 如果在构造CyclicBarrier对象的时候传了一个Runnable对象进去,则每次到达公共屏障点的时候都最先执行这个传进去的Runnable,然后再执行处于等待的Runnable。如果把上面的例子改成下面这样:

  1. package com.jalja.org.thread;
  2. import java.util.concurrent.CyclicBarrier;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class LockTest {
  6. public static void main(String [] args){
  7. CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {
  8. public void run() {
  9. System.out.println(Thread.currentThread().getName()+"======");
  10. try {
  11. Thread.sleep((long)(Math.random()*10000));
  12. }catch (Exception e){
  13. e.printStackTrace();
  14. }
  15. System.out.println(Thread.currentThread().getName()+"======>");
  16. }
  17. });
  18. ExecutorService executorService= Executors.newFixedThreadPool(3);
  19. Runnable threadTest=null;
  20. for(int i=0;i<3;i++){
  21. threadTest=new ThreadTest(cyclicBarrier);
  22. executorService.execute(threadTest);
  23. }
  24. executorService.shutdown();
  25. }
  26. }
  27. class ThreadTest implements Runnable{
  28. private CyclicBarrier cyclicBarrier;
  29. public ThreadTest(CyclicBarrier cyclicBarrier){
  30. this.cyclicBarrier=cyclicBarrier;
  31. }
  32. public void run() {
  33. try {
  34. Thread.sleep((long)(Math.random()*10000));
  35. System.out.println(Thread.currentThread().getName()+"开始执行");
  36. cyclicBarrier.await();
  37. }catch (Exception e){
  38. e.printStackTrace();
  39. }
  40. System.out.println(Thread.currentThread().getName()+"执行结束");
  41. }
  42. }

结果:

  1. pool-1-thread-2开始执行
  2. pool-1-thread-3开始执行
  3. pool-1-thread-1开始执行
  4. pool-1-thread-1======
  5. pool-1-thread-1======>
  6. pool-1-thread-1执行结束
  7. pool-1-thread-2执行结束
  8. pool-1-thread-3执行结束

java 线程之concurrent中的常用工具 CyclicBarrier的更多相关文章

  1. 【Java基础】Java开发过程中的常用工具类库

    目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...

  2. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  3. Java基础-考察JVM内部结构的常用工具介绍

    Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...

  4. 25.mysql中的常用工具

    25.mysql中的常用工具25.1 mysql客户端连接工具跳转至mysql安装目录下的bincd C:\Program Files\MySQL\MySQL Server 5.7\binmac下cd ...

  5. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...

  6. 【spring】spirng中的常用工具类

    一.概述 很多时候,很多工具类其实spring中就已经提供,常用的工具类有: 参考:https://www.cnblogs.com/langtianya/p/3875103.html 内置的resou ...

  7. java多线程之Concurrent包

    1.在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题. 2.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的 ...

  8. java.util.concurrent中的常用组件

    一. CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执 ...

  9. 多线程之BlockingQueue中 take、offer、put、add的一些比较

    一.概述: BlockingQueue作为线程容器,可以为线程同步提供有力的保障.   二.BlockingQueue定义的常用方法 1.BlockingQueue定义的常用方法如下:   抛出异常 ...

随机推荐

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)--S ...

  2. [BZOJ4518]征途

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MB Description Pine开始了从S地到T地的征途. 从S地到T地的路可以 ...

  3. CVE-2017-8464远程命令执行漏洞(震网漏洞)复现

    前言 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞, ...

  4. 微信小程序开发过程中一些经验总结

    1.微信开发者工具报错,微信小程序最低需支持tls1.2版本的问题 原因是服务器不支持ssl的高版本,解决方法: 在/etc/nginx/conf.d文件下,把"ssl_protocols  ...

  5. (原创)用JAX-WS+Spring实现简单soap规范的webservice

    转载请注明出处:http://www.cnblogs.com/Starshot/p/7050084.html Soap即简单对象访问协议,也可理解为一种用于程序之间通讯的规范,它主要基于XML和htt ...

  6. Win10 & Linux Docker 安装使用

    Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下. 一.Windows Docker 安装 1.安装 需要的条件为: 64bit Windows 10,开启Hype ...

  7. 修改apache的默认www目录

    httpd.conf配置文件#DocumentRoot "/var/www/html" //修改前DocumentRoot "/www" #<Direct ...

  8. PILLOW图片中加入中文 曲线救国Opencv

    索引 简述 准备 示例 效果图 结语 简述 我在使用opencv2或3的时候想要在图片上添加中文文字,需要去下载Freetype库,编译好链接到opencv库中才能中文的输出.网上大部分在图片中插入中 ...

  9. android权限(permission)大全

    权限添加位置: 权限代码: 1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_ ...

  10. 一级缓存二级缓存(hibernate)

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...