博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 编程下 CyclicBarrier 中的线程等待
阅读量:7061 次
发布时间:2019-06-28

本文共 2409 字,大约阅读时间需要 8 分钟。

CyclicBarrier 是 java.util.concurrent.CyclicBarrier 下的一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。

先来看 CyclicBarrier 的 API

  • CyclicBarrier(int parties, Runnable barrierAction) : 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
  • await() : 在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。

如下的测试代码运行后,程序会通过构造方法 CyclicBarrier(int parties, Runnable barrierAction) 指定等待的线程数为 3,new Runnable() 中的 run() 方法会一直处于等待状态,3 个子线程会被执行,直到 3 个子线程中的 barrier.await() 方法都被执行后,3 个子线程处于等待状态,并且由最后一个进入 barrier 的线程执行 CyclicBarrier(int parties, Runnable barrierAction) 中的 run() 方法,run() 方法中的代码执行完毕后处于等待的 3 个子线程被唤醒,继续执行各自的代码。

package cn.sunzn.test;import java.util.concurrent.CyclicBarrier;public class MyCyclicBarrier {   public static void main(String[] args) {       System.out.println(Thread.currentThread().getName() + " : execute Task on main thread");       executeCyclicBarrier();   }   private static void executeCyclicBarrier() {       CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {           public void run() {               System.out.println(Thread.currentThread().getName() + " : execute Task on barrier.await()");           }       });       new Thread(new ComponentThread(barrier)).start();       new Thread(new ComponentThread(barrier)).start();       new Thread(new ComponentThread(barrier)).start();   }   public static class ComponentThread implements Runnable {       CyclicBarrier barrier;       public ComponentThread(CyclicBarrier barrier) {           this.barrier = barrier;       }       public void run() {           try {               System.out.println(Thread.currentThread().getName() + " : execute Task before barrier.await()");               barrier.await();               System.out.println(Thread.currentThread().getName() + " : execute Task after barrier.await()");           } catch (Exception e) {               e.printStackTrace();           }       }   }}

运行结果如下,代码每次运行的结果会根据 CPU 的切换频率有所不同:

main : execute Task on main threadThread-0 : execute Task before barrier.await()Thread-1 : execute Task before barrier.await()Thread-2 : execute Task before barrier.await()Thread-2 : execute Task on barrier.await()Thread-2 : execute Task after barrier.await()Thread-0 : execute Task after barrier.await()Thread-1 : execute Task after barrier.await()

 

转载地址:http://hfyll.baihongyu.com/

你可能感兴趣的文章
枚举 学习笔记
查看>>
使用生成器把Kafka写入速度提高1000倍G
查看>>
从JDK源码角度看并发竞争的超时
查看>>
大众点评点餐小程序开发经验 - 数据采集
查看>>
EasyReact的简单试用及和RAC的对比
查看>>
一个典型案例为你解读TDSQL 全时态数据库系统
查看>>
计算机程序的思维逻辑 (45) - 神奇的堆
查看>>
打造自己的 APP「冰与火百科」(二):接口、索引页
查看>>
详解卷积神经网络(CNN)在语音识别中的应用
查看>>
程序员如何切入区块链去中心化应用开发
查看>>
Git简单介绍
查看>>
消息队列之 RocketMQ
查看>>
[译] 使用深度学习自动生成 HTML 代码 - 第 1 部分
查看>>
Redis Stream应用案例
查看>>
聊聊EurekaRibbonClientConfiguration
查看>>
聊聊spring cloud的EurekaServerInitializerConfiguration
查看>>
Rxjava2操作符入门(一)
查看>>
Java 代码性能调优“三十六”策
查看>>
《Python基础教程》PDF
查看>>
Laravel使用Passport来创建API用户认证
查看>>