`

CyclicBarrier使用详解

 
阅读更多
  1. import java.util.Random;  
  2. import java.util.concurrent.CyclicBarrier;  
  3.   
  4. /** *//** 
  5.  * CyclicBarrier类似于CountDownLatch也是个计数器, 
  6.  * 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 
  7.  * 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 
  8.  * CyclicBarrier就象它名字的意思一样,可看成是个障碍, 
  9.  * 所有的线程必须到齐后才能一起通过这个障碍。 
  10.  * CyclicBarrier初始时还可带一个Runnable的参数, 
  11.  * 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。 
  12.  */  
  13. public class CyclicBarrierTest {  
  14.   
  15.     public static class ComponentThread implements Runnable {  
  16.         CyclicBarrier barrier;// 计数器  
  17.         int ID;    // 组件标识  
  18.         int[] array;    // 数据数组  
  19.   
  20.         // 构造方法  
  21.         public ComponentThread(CyclicBarrier barrier, int[] array, int ID) {  
  22.             this.barrier = barrier;  
  23.             this.ID = ID;  
  24.             this.array = array;  
  25.         }  
  26.   
  27.         public void run() {  
  28.             try {  
  29.                 array[ID] = new Random().nextInt(100);  
  30.                 System.out.println("Component " + ID + " generates: " + array[ID]);  
  31.                 // 在这里等待Barrier处  
  32.                 System.out.println("Component " + ID + " sleep");  
  33.                 barrier.await();  
  34.                 System.out.println("Component " + ID + " awaked");  
  35.                 // 计算数据数组中的当前值和后续值  
  36.                 int result = array[ID] + array[ID + 1];  
  37.                 System.out.println("Component " + ID + " result: " + result);  
  38.             } catch (Exception ex) {  
  39.             }  
  40.         }  
  41.     }  
  42.     /** *//** 
  43.      * 测试CyclicBarrier的用法 
  44.      */  
  45.     public static void testCyclicBarrier() {  
  46.         final int[] array = new int[3];  
  47.         CyclicBarrier barrier = new CyclicBarrier(2new Runnable() {  
  48.             // 在所有线程都到达Barrier时执行  
  49.             public void run() {  
  50.                 System.out.println("testCyclicBarrier run");  
  51.                 array[2] = array[0] + array[1];  
  52.             }  
  53.         });  
  54.   
  55.         // 启动线程  
  56.         new Thread(new ComponentThread(barrier, array, 0)).start();  
  57.         new Thread(new ComponentThread(barrier, array, 1)).start();  
  58.     }  
  59.   
  60.     public static void main(String[] args) {  
  61.         CyclicBarrierTest.testCyclicBarrier();  
  62.     }  
  63. }  



说明:在main中执行testCyclicBarrier方法 
执行到CyclicBarrier barrier = new CyclicBarrier(2, new Runnable()...)时 
Runnable的参数是在CyclicBarrier的数目达到2时并且所有被CyclicBarrier.await()进入等待的线程被唤醒前执行。 
所以继续执行下面的两个线程 
new Thread(new ComponentThread(barrier, array, 0)).start(); 
new Thread(new ComponentThread(barrier, array, 1)).start(); 
执行public void run()方法,分别执行,互不影响 
执行到barrier.await();时该线程进入等待状态,当两个线程都执行完barrier.await();时,进入到new CyclicBarrier(2, new Runnable()...)里面的方法, 执行完里面的方法后,等待的两个线程再次被唤醒,继续各自执行线程后面的语句。 

分享到:
评论

相关推荐

    CyclicBarrier的用法

    `ThreadDemo`可能是一个简单的示例程序,它演示了如何使用`CyclicBarrier`来控制多个线程的同步行为。通常,这样的示例会创建多个线程,每个线程执行一些任务,然后在`CyclicBarrier`上等待,直到所有线程都完成任务...

    JAVA CyclicBarrier类详解.docx

    《JAVA CyclicBarrier类详解》 CyclicBarrier是Java并发包(java.util.concurrent)中一个重要的同步辅助类,它的主要作用在于协调多个线程之间的协作,使得这些线程能够一起到达一个公共的“集结点”(称为屏障点...

    Java并发编程(CyclicBarrier)实例详解

    Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...

    28 人齐了,一起行动—CyclicBarrier详解.pdf

    4. CyclicBarrier 的一个重要特性是它可以循环使用。一旦所有线程完成当前轮次的同步,计数器会自动重置,允许下一轮同步。 在实际编程中,CyclicBarrier 可用于多种场景,例如多线程计算的初始化阶段,所有参与...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    ### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...

    java多线程之CyclicBarrier的使用方法

    Java多线程之CyclicBarrier的使用方法 Java多线程之CyclicBarrier的使用方法是Java多线程编程中的一种同步机制,用于实现多个线程之间的同步协作。CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    它的核心概念是“代”,每个使用CyclicBarrier的事件都对应一个代,当所有参与线程到达barrier点时,这一代结束,然后可以开始下一轮。CyclicBarrier的`lock`字段用于保护屏障的入口,`trip`条件变量用于线程在...

    Java异步调用转同步方法实例详解

    Java中将异步调用转换为同步调用有多种方法,本文将详细介绍五种方法:使用wait和notify方法、使用条件锁、使用Future、使用CountDownLatch、使用CyclicBarrier。 1. 使用wait和notify方法 wait和notify方法是...

    juc详解juc详解juc详解juc详解juc详解juc详解juc详解

    - `CyclicBarrier`:回环栅栏,允许一组线程等待其他线程到达某个点后再继续执行。 - `Semaphore`:信号量,控制同时访问特定资源的线程数量。 - `Phaser`:更为灵活的同步器,可以注册线程并等待特定阶段。 5. ...

    Java多线程详解

    以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...

    Java并发编程原理与实战

    并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask使用.mp4 Future设计模式实现(实现...

    Java.Bug模式详解

    理解并发容器如ConcurrentHashMap、CopyOnWriteArrayList的工作原理,以及如何使用CountDownLatch、CyclicBarrier等工具,可以有效避免这类问题。 5. **资源管理**:在处理I/O流或其他资源时,忘记关闭可能会导致...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    在Java多线程编程中,CyclicBarrier、Callable、Future和FutureTask是四个重要的组件,它们各自提供了不同的功能,帮助开发者更好地管理和协调并发任务。接下来,我们将深入探讨这些组件的特性和使用方法。 首先,...

    图灵Java高级互联网架构师第6期并发编程专题笔记.zip

    内容包括 01-并发编程之深入理解JMM&并发三大特性(一)-fox 02-并发编程之深入理解JMM&并发三...11-深入理解AQS之CyclicBarrier&ReentrantReadWriteLock详解-fox 12-深入理解AQS之ReentrantReadWriteLock详解-fox ...

    CountDownLatch、Semaphore等4大并发工具类详解

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    java千道例题代码详解

    并发编程也是Java的一大特色,资料可能会包含线程同步、并发工具类如Semaphore、CountDownLatch、CyclicBarrier的使用,以及ExecutorService和Future接口的理解。这有助于学习者在多核处理器环境下编写高性能的应用...

    java多线程设计模式详解+源码

    Java多线程设计模式是Java...通过阅读“java多线程设计模式详解”文档和分析源码,你将掌握如何在Java项目中高效地使用多线程,解决并发编程中的各种问题,提升程序的性能和稳定性。这是一份值得深入研究的宝贵资料。

Global site tag (gtag.js) - Google Analytics