`

CyclicBarrier的使用实例

阅读更多

CyclicBarrier允许给定数量的线程全部到达关卡点时,关卡就被成功突破,关卡被重置以备下一次使用。跟CountDownlatch特别类似,但是CountDownLatch不同的是不能被重新重置再使用。

 

前面的blog说到用countdownlatch去完成方法里面的3个service的调用。用cyclicBarrier同样可以实现。

 

package cyclicbarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-4-26
 *
 **/
public class CyclicBarrierSample {
   
    public static void main(String[] args) {
        String[] strs = getResult();
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
      
    }
  
    public static String[] getResult(){
        String[] strs = new String[3];
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4);
        Work1 work1 = new Work1(cyclicBarrier,strs[0]);
        Work2 work2 = new Work2(cyclicBarrier,strs[1]);
        Work3 work3 = new Work3(cyclicBarrier,strs[2]);
        work1.start();
        work2.start();
        work3.start();
        try {
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        strs[0] = work1.str1;
        strs[1] = work2.str2;
        strs[2] = work3.str3;
        return strs;
    }
}

class Work1 extends Thread{
    public String str1;
    public CyclicBarrier cyclicBarrier1;
    public Work1(CyclicBarrier cyclicBarrier1,String str1){
        this.cyclicBarrier1 = cyclicBarrier1;
        this.str1 = str1;
    }
  
  
    public void run(){
        str1="work1";
        try {
            cyclicBarrier1.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class Work2 extends Thread{
    public String str2;
    public CyclicBarrier cyclicBarrier2;
    public Work2(CyclicBarrier cyclicBarrier2,String str2){
        this.cyclicBarrier2 = cyclicBarrier2;
        this.str2 = str2;
    }
  
  
    public void run(){
        try {
            Thread.sleep(3000);
            str2="work2";
            cyclicBarrier2.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }
}

class Work3 extends Thread{
    public String str3;
    public CyclicBarrier cyclicBarrier3;
    public Work3(CyclicBarrier cyclicBarrier3,String str3){
        this.cyclicBarrier3 = cyclicBarrier3;
        this.str3 = str3;
    }
  
  
    public void run(){
        try {
            Thread.sleep(3000);
            str3="work3";
            cyclicBarrier3.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      
    }
}

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    - 使用CyclicBarrier实现多线程分治策略,每个子任务完成后来一次全局计算的例子。 - 线程间的异常处理,包括中断和超时的处理。 - 结合Future和ExecutorService,进一步提高并发性能和灵活性。 - 在大型项目中的...

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

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

    Java并发实例之CyclicBarrier的使用

    Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...

    Java并发编程之栅栏(CyclicBarrier)实例介绍

    2. **CyclicBarrier的使用**: - **构造器**:创建CyclicBarrier时需要指定线程数量n和可选的屏障动作。屏障动作会在所有线程都到达屏障点后执行。 - **await方法**:每个线程在到达屏障点时调用await方法,这会...

    java多线程之CyclicBarrier的使用方法

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

    CyclicBarrier用法.docx

    1. **重复使用性**:与CountDownLatch不同,CyclicBarrier可以在所有线程都达到屏障点后重置,允许再次使用。这意味着一旦所有线程都完成各自的任务并调用await()方法,屏障将被重置,计数器恢复到初始值,可以进行...

    Java中CyclicBarrier的用法分析

    `CyclicBarrier`的名字来源于它的可重用性,一旦一组线程通过了屏障,它可以重置并再次使用,而不是像`CountDownLatch`那样只能使用一次。 在上述的测试代码中,我们创建了一个`CyclicBarrier`实例,设置了线程数为...

    Java中的CyclicBarrier类最全讲义

    要使用`CyclicBarrier`,首先需要创建一个实例对象。在构造函数中,我们需要指定参与线程的数量以及当所有线程都到达屏障点时所要执行的操作(如果有的话)。这是一个典型的使用示例: ```java import java.util....

    java高级编程100实例

    10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...

    140个Java源码实例

    15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...

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

    1. **初始化:** 使用给定的计数值创建一个 CountDownLatch 实例。 2. **递减计数器:** 在需要完成的工作完成后,调用 `countDown()` 方法来递减计数器。 3. **等待:** 其他线程调用 `await()` 方法来等待计数器的...

    Java高级编程实例 100个

    10. **并发工具类**:如Semaphore(信号量)、CountDownLatch(倒计时锁)、CyclicBarrier(回环栅栏)等,用于控制并发访问和同步。 通过这100个实例,初学者不仅能掌握Java高级特性,还能提升问题解决能力和实际...

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

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

    java多线程编程实例_Source

    实例中可能涵盖了这两种方式的使用,并通过不同示例解释它们的异同和适用场景。 二、线程控制 1. 同步机制:包括synchronized关键字和Lock接口(如ReentrantLock可重入锁)。synchronized用于解决共享资源的并发...

    Android开发必备实例

    13. **多线程**:了解如何使用线程池、线程同步机制(如synchronized关键字、CountDownLatch、CyclicBarrier)对提高应用性能至关重要。 14. **依赖注入**:如使用Dagger 2或Koin进行依赖注入,可简化代码结构,...

    SUN公司的java实例代码

    15. **并发工具**:如Semaphore、CyclicBarrier、ExecutorService等,这些工具在多线程编程中非常有用,实例可能有它们的应用。 通过研究这些" SUN公司的java实例手册 ",无论是初学者还是经验丰富的开发者,都能...

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...

    JAVA多线程的实例

    当你有一个实现了`Runnable`接口的类时,你可以创建一个`Thread`对象并传入你的`Runnable`实例,如: ```java Runnable task = new MyRunnable(); Thread thread = new Thread(task); thread.start(); ``` 这里,`...

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

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

    Java程序设计技巧与开发实例

    Java提供了丰富的并发工具,如Semaphore、CountDownLatch和CyclicBarrier,学习者需了解其用法和适用场景。 除此之外,Java集合框架是存储和操作数据的重要工具,包括List、Set、Map等接口及其实现类。学习者应熟悉...

Global site tag (gtag.js) - Google Analytics