10、CyclicBarrier

java.util.concurrent

Class CyclicBarrier

使得一系列的线程相互等待,直到全部线程都到达一个公共的屏障点。这个屏障之所以称为Cyclic(循环的),是因为它能够在等待线程释放后重复使用。

CyclicBarrier支持一个可选Runnable的参数,在每个屏障点运行一次(只有当所有的线程都到达时,才会执行)。

 1 class Solver {
 2        final int N;
 3        final float[][] data;
 4        final CyclicBarrier barrier;
 5
 6        class Worker implements Runnable {
 7          int myRow;
 8          Worker(int row) { myRow = row; }
 9          public void run() {
10            while (!done()) {
11              processRow(myRow);
12
13              try {
14                barrier.await();
15              } catch (InterruptedException ex) {
16                return;
17              } catch (BrokenBarrierException ex) {
18                return;
19              }
20            }
21          }
22        }
23
24        public Solver(float[][] matrix) {
25          data = matrix;
26          N = matrix.length;
27          barrier = new CyclicBarrier(N,
28                                      new Runnable() {
29                                        public void run() {
30                                         // mergeRows(...);
31                                        }
32                                      });
33          for (int i = 0; i < N; ++i)
34            new Thread(new Worker(i)).start();
35
36          waitUntilDone();
37        }
38 }

程序分析:

这个程序的框架在实际应用中还是很好用的,比如这么一个应用场景:将10个文件的正整数按从小到达的顺序进行合并。按照这个框架的思路,我们可以先将十个文件的数据放到一个二维数组当中来。

每一行就是一个文件当中的数据。首先我们使用十个线程分别对十个数组进行排序,当然,采用的排序方式不同或者别的原因,排序时长有先有后,只有当所有的数组都排完序以后,就可以处理CyclicBarrier

里面初始化的Runnable。要不然先排完序的线程就会阻塞等待其他排好序的线程。当然,这个应用场景的真正算法还是在Runnable里面,也就是当数组排好序了,如何按从小到大的顺序合并它们。

可以这样,先从10个数组里面拿出第一个最小的,这十个进行比较,就可以得到目标数组中的第一个正整数。然后看这个正整数取自于哪个数组,于是这个数组当中的第二个数就充当了取出去的那个数的角色。

于是,又拿它与其他数组当中的最小数再进行比较得到次最小,如此反复。

时间: 2024-10-16 15:19:20

10、CyclicBarrier的相关文章

并发工具类:CountDownLatch、CyclicBarrier、Semaphore

在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch 1 import java.util.concurrent.CountDownLatch; 2 3 4 public class CountDownLatchTest 5 { //设置N为2 6 static CountDownLatch c = new CountDownLatch(2); 7 p

Java并发(7):CountDownLatch、CyclicBarrier、Callable、Future

CountDownLatch.CyclicBarrier.Callable.Future  都位于java.util.concurrent包下,其中CountDownLatch和CyclicBarrier属于该包中的tools分支,Callable和Future属于该包中的executer分支. 一.CountDownLatch CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.比如有一个任务A,它要等待其他4个任务执行完毕之后才能执

并发编程(七)——AbstractQueuedSynchronizer 之 CountDownLatch、CyclicBarrier、Semaphore 源码分析

这篇,我们的关注点是 AQS 最后的部分,共享模式的使用.本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier.Semaphore 的源码一起过一下. CountDownLatch CountDownLatch 这个类是比较典型的 AQS 的共享模式的使用,这是一个高频使用的类.使用方法在前面一篇文章中有介绍 并发编程(二)—— CountDownLatch.CyclicBarrier和Semaphore 使用例子 我们看下 Do

【转】ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)

chr(9) tab空格       chr(10) 换行      chr(13) 回车        Chr(13)&chr(10) 回车换行       chr(32) 空格符       chr(34) 双引号       chr(39) 单引号 chr(33) !        chr(34) "        chr(35) #        chr(36) $        chr(37) %        chr(38) &        chr(39) '   

Java 并发同步器之CountDownLatch、CyclicBarrier

一.简介 1.CountDownLatch是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序的执行. CountDownLatch可以看作是一个倒计数的锁存器,当计数减至0时触发特定的事件.利用这种特性,可以让主线程等待子线程的结束. CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待

10、使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。

/**10.使用TCP协议完成一个客户端一个服务器.客户端从键盘输入读取一个字符串,发送到服务器. 服务器接收客户端发送的字符串,反转之后发回客户端.客户端接收并打印. * 客户端*/ import java.io.*; import java.net.*; public class Test10_Client { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.0.

10、表单元素之input标签属性(中)

一.type属性总汇 input元素可以用来生成一个供用户输入数据的简单文本框.在默认的情况下,什么样的数据都可以输入.而通过不同的属性值,可以限制输入的内容.            属性名称                                       说明 text 一个单行文本框,默认行为 password 隐藏字符的密码框 search 搜索框,在某些浏览器键入内容会出现叉标记取消 submit.reset.button 生成一个提交按钮.重置按钮.普通按钮 number.

【Android 初学】10、Intent对象的使用

Start Android 1.Intent对象的基本概念 1)Intent是Android应用程序组件之一: 2)Intent对象在Android系统当中表示一种意图: 3)Intent当中最重要的内容是action与data: 2.Intent对象的基本使用方法 3.使用Intent在Activity之间传递数据的方法 1)在Activity之间可以通过Intent对象传递数据: 2)使用putExtra()系列方法向Intent对象当中存储数据 3)使用getXXXExtra()系列方法从

10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613 容器 3.0版本之前Cocos2d-x 引擎为我们提供了 CCArray. CCDictionary 等 Objective-C 风格的容器: 使用 Cocos2d-x 容器的一个重要原因在于 Cocos2d-x 的内存管理. 一般来说,被存入容器的对象在移除之前都应该保证是有效的, 但值得注意的是,在v3.0 beta版本中加入了数据结