zoukankan      html  css  js  c++  java
  • Java 编程下 CyclicBarrier 中的线程等待

    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 thread
    Thread-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()
  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/sunzn/p/2910260.html
Copyright © 2011-2022 走看看