`
huangjinjin520
  • 浏览: 71532 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java并发之同步辅助类CyclicBarrier

阅读更多
CyclicBarrier含义:

栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入另一个Runnable对象作为初始化参数。当所有的线程都到达集合点后,CyclicBarrier类将Runnable对象作为线程执行。

方法:
await():使线程置入休眠直到最后一个线程的到来之后唤醒所有休眠的线程

例子
在矩阵(二维数组)中查找一个指定的数字。矩阵将被分为多个子集,每个子集交给一个线程去查找。当所有线程查找完毕后交给最后的线程汇总结果。
查找类:在一个子集中查找指定数字,找到之后把结果存储后调用await()方法置入休眠等待最后一个线程的到来唤醒
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Searcher implements Runnable {

private  CyclicBarrier barrier;

private  int[] submock;

private  List<Result> result;

private int row;

private int searchNmu;

public Searcher(int[] submock, List<Result> result,  CyclicBarrier barrier, int row, int searchNmu) {
this.barrier = barrier;
this.submock = submock;
this.result = result;
this.row = row;
this.searchNmu = searchNmu;
}


@Override
public void run() {
System.out.printf("%s: Processing lines from %d .\n", Thread.currentThread().getName(), row);
for(int i=0; i<submock.length; i++){
if(submock[i] == searchNmu){
Result r = new Result();
r.setRow(row);
r.setCol(i);
result.add(r);
}
}
System.out.printf("%s: Lines processed.\n", Thread.currentThread().getName());
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}

结果类:

public class Result {

//行
int row;
//列
int col;

public int getRow() {
return row;
}

public void setRow(int row) {
this.row = row;
}

public int getCol() {
return col;
}

public void setCol(int col) {
this.col = col;
}

}

汇总类:汇总每个Searcher找到的结果:
import java.util.List;

public class Grouper implements Runnable {

private List<Result> result;

int[][] mock;

public Grouper(List<Result> result, int[][] mock) {
this.result = result;
this.mock = mock;
}

@Override
public void run() {
System.out.printf("Grouper: Processing results...\n");
for (int i = 0; i < result.size(); i++) {
Result r = result.get(i);
if(r!=null)
System.out.println("mock[" + r.row + "][" + r.col + "]" + mock[r.row][r.col]);
}
System.out.printf("Grouper proccessing end...\n");
}
}

主函数,如何把Searcher和Grouper类配合起来呢??
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierMain {

public static void main(String[] args) {
// 要找的数据
final int SEARCH = 5;

// 矩阵的声明
int[][] mock = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
{ 1, 2, 3, 5, 5, 6, 7, 8, 9, 10 },
{ 5, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
{ 1, 2, 3, 4, 6, 6, 7, 8, 5, 10 },
{ 1, 5, 3, 4, 5, 6, 7, 8, 5, 10 },
{ 1, 5, 3, 4, 12, 6, 7, 8, 0, 5 } };
// 查找的线程数
int PARTICIPANTS = mock.length;
List<Result> result = new ArrayList<Result>();
// 汇总线程
Grouper grouper = new Grouper(result, mock);
// 栅栏,传入参数含义:线程同步个数,汇总线程
CyclicBarrier barrier = new CyclicBarrier(PARTICIPANTS, grouper);

Searcher searchers[] = new Searcher[PARTICIPANTS];

for (int i = 0; i < PARTICIPANTS; i++) {
searchers[i] = new Searcher(mock[i], result, barrier, i, SEARCH);
Thread thread = new Thread(searchers[i]);
thread.start();
}
System.out.printf("Main: The main thread has finished.\n");
}

}

需要注意的地方
线程完成任务后调用CyclicBarrier的await()方法休眠等待。在所有线程在集合点均到达时,栅栏调用传入的Runnable对象进行最后的执行。
与CountDownLatch的区别:
在所有线程到达集合点后接受一个Runnable类型的对象作为后续的执行
没有显示调用CountDown()方法
CountDownLatch一般只能使用一次,CyclicBarrier可以多次使用
应用场景
多个线程做任务,等到达集合点同步后交给后面的线程做汇总

关注公众号可以获取各种视频

  • 大小: 39.9 KB
0
0
分享到:
评论

相关推荐

    java并发编程

    3. **CyclicBarrier**和**CountDownLatch**: 这两个都是同步辅助类,用于控制多个线程间的协作。CyclicBarrier允许一组线程等待所有线程到达某个屏障点后再继续执行,而CountDownLatch则允许一个线程等待其他指定...

    Java并发工具包

    Java并发工具包中包含了一些同步辅助类,如Semaphore(信号量)、CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)。它们帮助协调多线程间的协作,控制线程的并发访问数量或等待特定条件。 六、FutureTask...

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

    Java并发编程中的栅栏(CyclicBarrier)是一个同步辅助类,它允许一组线程等待彼此到达某个特定点,然后一起继续执行。这个特定点被称为屏障点。与闭锁(CountDownLatch)不同,闭锁通常是一次性的,而CyclicBarrier...

    Java并发工具辅助类代码实例

    Java并发工具辅助类代码实例 Java并发工具辅助类代码实例主要介绍了Java并发...CountDownLatch和CyclicBarrier都是Java并发工具辅助类的重要组成部分,它们能够帮助开发者更好地管理多线程,提高程序的性能和可靠性。

    Java并发实例之CyclicBarrier的使用

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

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

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 ...CountDownLatch、CyclicBarrier和Semaphore都是Java并发编程中非常重要的辅助类,它们可以帮助开发者更好地进行并发编程。

    java并发工具包

    5. **CountDownLatch**:这个同步辅助类允许一个或多个线程等待其他线程完成操作。通常用于初始化阶段,主线程等待所有子线程完成后再继续执行。 6. **CyclicBarrier**:允许一组线程相互等待,直到所有线程都到达...

    Java 并发编程实战

    另外,`CountDownLatch`, `CyclicBarrier`, `Semaphore`等同步辅助类也是并发编程中常用的工具,它们有助于实现复杂的同步策略。 对于并发编程中的死锁、活锁和饥饿问题,书中给出了详细的分析和解决方案。读者还将...

    java多线程并发编程例子

    1. **CyclicBarrier**:`CyclicBarrier`是一个同步辅助类,允许一组线程等待彼此到达一个公共屏障点。在所有线程都到达屏障后,屏障点被重置,然后线程可以继续执行。例如,`TestCyclicBarrier`和`TestCyclicBarrier...

    Java并发工具类示例

    `CyclicBarrier`是另一个同步辅助类,允许一组线程等待其他线程到达屏障点再继续执行。在`Demo_CyclicBarrier.java`中,我们可以看到如何设定屏障点,所有线程必须到达此点才能继续。CyclicBarrier还可以执行一个回...

    java 并发编程实战

    CountDownLatch和CyclicBarrier是同步辅助类,用于协调多个线程的执行,而Semaphore用于控制对共享资源的访问数量。 此外,书中还会详细讨论锁和同步机制,如synchronized关键字、volatile变量、读写锁...

    java 7并发编程实战手册 源码

    `Phaser`是更为灵活的同步辅助类,可以实现类似功能并支持自定义回退行为。 另外,Java 7对`ExecutorService`接口进行了扩展,引入了`Executors`工具类,方便创建不同类型的线程池,如`FixedThreadPool`、`...

    java并发原理与实战pdf.rar

    `CyclicBarrier`和`CountDownLatch`是两种重要的同步辅助类,前者用于一组线程等待彼此到达某个屏障点后一起继续执行,后者则用于一次性计数器,让一个或多个线程等待其他线程完成后再继续执行。 最后,`java.util....

    java并发视频教程.txt

    - **CountDownLatch**:一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。当计数器的值减至零时,等待线程继续执行。 - **CyclicBarrier**:允许一组线程相互等待,直到到达某个公共屏障点。不同于`...

    Java并发编程实战(中文版)

    - **CountDownLatch、CyclicBarrier和Semaphore**:这些同步辅助类在多线程协调中的应用,如计数器、栅栏和信号量。 - **Future和Callable**:描述了异步计算的实现,如何获取结果和取消任务。 5. **并发集合** ...

    java并发测试

    在这个场景下,`MutiThreadTest.java` 文件可能是用于实现并发测试的代码,而 `GroboUtils-5-core.jar` 包可能包含了辅助进行并发测试或处理并发问题的工具类。 首先,我们需要理解Java并发的基础。Java提供了一...

    java并发编程专题(九)----(JUC)浅析CyclicBarrier

    CyclicBarrier 是 Java 并发编程中的一个同步辅助工具,它允许一组线程全部等待彼此到达公共屏障点。它的字面意思是可循环使用的屏障,用于让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会...

    Java并发编程与高并发解决方案.txt

    `CountDownLatch`是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。通过调用`await()`方法,当前线程会等待,直到计数器的值减少到零。这通常用于实现多线程之间的同步等待机制。 ##### 3.3 ...

    JAVA并发编程实践

    `CountDownLatch`是一个同步辅助类,用来等待一组操作的完成。它通常用于实现多个线程等待一个或多个事件的发生。 ```java CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i ; i++) { new Thread...

    Java并发基础共6页.pdf.zip

    10. **CyclicBarrier**和**CountDownLatch**:这两个类是同步辅助工具,用于协调多个线程的执行。CyclicBarrier允许一组线程等待其他线程到达某个点后一起继续,CountDownLatch则让线程等待计数器归零后才能继续。 ...

Global site tag (gtag.js) - Google Analytics