`

CyclicBarrier 、CountDownLatch

阅读更多


      CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程(这个很重要,在初始化时要指定线程的数量)的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。 

     CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。主要方法 public CountDownLatch(int count); public void countDown(); public void await() throws InterruptedException。构造方法参数指定了计数的次数countDown方法,当前线程调用此方法,则计数减一awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

 

 

应用场景 
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。 

例:用三个线程处理一个二维数组,每个线程处理一行(每个元素值乘二),每处理完一列后等待 再一起处理下一列。

public void test() throws InterruptedException{

CountDownLatch start=new CountDownLatch(1);

CountDownLatch end=new CountDownLatch(3);

CyclicBarrier barrier=new CyclicBarrier(3, new Runnable(){

 

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("run at barrier ");

for(int i=0;i<3;i++){

System.out.println(result[0][i]+result[1][i]+result[2][i]);

}

}});

for(int i=0;i<3;i++){

new Thread(new TestThread(barrier,i,start,end)).start();

}

Thread.sleep(3000);

System.out.println("start ........");

start.countDown();

System.out.println("wait to end  ........");

end.await();

System.out.println("end  ........");

 

}

public  int[][] data=new int[][]{{1,2,3},{1,2,3},{1,2,3}};

public  int[][] result=new int[3][3];

 

class TestThread implements Runnable{

CyclicBarrier barrier;

int row;

CountDownLatch start;

CountDownLatch end;

public TestThread(CyclicBarrier barrier, int row,CountDownLatch start,

CountDownLatch end) {

super();

this.barrier = barrier;

this.row = row;

this.start=start;

this.end=end;

}

 

@Override

public void run() {

// TODO Auto-generated method stub

try {

System.out.println("wait to start "+Thread.currentThread().getName());

start.await();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

for(int i=0;i<3;i++){

System.out.println("run at thread "+Thread.currentThread().getName()+"  row "+i);

result[row][i]=data[row][i]*2;

try {

 

barrier.await();

 

} catch (InterruptedException e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

} catch (BrokenBarrierException e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

}

}

end.countDown();

}

 

}

 

wait to start Thread-0

wait to start Thread-1

wait to start Thread-2

start ........

wait to end  ........

run at thread Thread-2  row 0

run at thread Thread-1  row 0

run at thread Thread-0  row 0

run at barrier 

6

0

0

run at thread Thread-0  row 1

run at thread Thread-2  row 1

run at thread Thread-1  row 1

run at barrier 

6

12

0

run at thread Thread-1  row 2

run at thread Thread-2  row 2

run at thread Thread-0  row 2

run at barrier 

6

12

18

end  ........

 

 

 这与join还不一样,join是在所有的线程结束后,父线程才能继续执行,而CyclicBarrier 则是在子线程内部等待,当所有的线程完成相应的操作步骤后,再进行下一步操作。join类似于汇总,而CyclicBarrier 则用于子线程统一步伐。

 

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

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

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

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

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

    在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

    CountDownLatch练习

    1. **CountDownLatch与CyclicBarrier的区别**:CountDownLatch是一次性的,计数到零后无法重用;CyclicBarrier可以重置,允许多次同步点。 2. **如何避免死锁与饥饿**:在使用CountDownLatch时,要确保所有线程都能...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...

    CyclicBarrier用法.docx

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

    Java中的CyclicBarrier类最全讲义

    虽然`CyclicBarrier`和`CountDownLatch`都是Java并发工具包中用于实现线程间协作的工具,但它们之间存在一些关键的区别: - **用途**:`CyclicBarrier`主要用于需要多个线程同时到达一个点的情况,而`...

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

    CyclicBarrier 是 Java 并发库中的一种同步工具类...在设计多线程应用时,根据具体需求选择合适的同步工具,如 CyclicBarrier、CountDownLatch 或 Semaphores,可以有效地避免竞态条件和死锁,提高系统的并行处理能力。

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    下面我们将深入探讨CountDownLatch的原理、使用方法以及与CyclicBarrier的区别。 首先,CountDownLatch的构造函数接受一个整数参数`count`,这个值表示计数器的初始值。当这个计数器归零时,所有等待在`await()`...

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

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

    countdownlatch-example-sourcecode.zip

    如果需要重复使用,考虑使用CyclicBarrier或Semaphore等其他同步工具。 - 误用可能导致死锁,比如计数器设置过大或者`countDown()`未正确调用,可能会导致等待的线程永久阻塞。 通过对`countdownlatch-example-...

    线程实例(并发库引入到Java标准库 )

    有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore

    Java并发编程之美_部分71

    本节主要讲解了Java并发包中线程同步器原理剖析,具体来说是 CountDownLatch 和 CyclicBarrier 的使用和原理剖析。 一、CountDownLatch CountDownLatch 是一个同步工具,它可以让一个线程等待其他线程完成某些操作...

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

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

Global site tag (gtag.js) - Google Analytics