- 浏览: 71532 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Alex_Cheung:
对了,第二个没有提取码,请知悉。
一大波视频分享 -
Alex_Cheung:
谢谢分享。
一大波视频分享 -
Jiy:
很详细,谢谢分享
java并发之同步辅助类Phaser -
walle1027:
非常不错,学习了。
java并发之同步辅助类Phaser -
huangjinjin520:
somefuture 写道除了单词写错了 其他挺好的已更正
dubbo注解使用详解
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可以多次使用
应用场景
多个线程做任务,等到达集合点同步后交给后面的线程做汇总
关注公众号可以获取各种视频
栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用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可以多次使用
应用场景
多个线程做任务,等到达集合点同步后交给后面的线程做汇总
关注公众号可以获取各种视频
发表评论
-
一大波视频分享
2018-06-09 09:36 11451.ps 链接: https://pan.baidu ... -
利用Sharding-Jdbc实现分表
2018-05-24 22:32 3792你们团队使用SpringMVC+Spr ... -
MINA原理详解
2018-05-19 13:51 14901. 通过SocketConnector同服务器端建立连接 ... -
最近有人说我欺骗消费者,今天来一波视频分享
2018-05-12 21:00 1257最近有人说我欺骗消费者,今天来一波视频分享 dubbo入门 ... -
SVN多版本库环境的搭建
2018-05-02 21:00 1217一、 1、启动SVN sudo svn ... -
前端 Java Python等资源合集大放送
2018-04-21 22:11 700如果需要学习视频,欢 ... -
Nginx会话保持之nginx-sticky-module模块
2018-04-16 20:34 1970在使用负载均衡的时候会遇到会话保持的问题,常用的方法有: 1. ... -
dubbo源码学习(四):暴露服务的过程
2018-04-14 11:38 981dubbo采用的nio异步的通信,通信协议默认为 netty, ... -
dubbo源码学习(四)初始化过程细节:解析服务
2018-04-12 20:32 619今天将真正去看dubbo内部的实现过程,看dubbo的源码前我 ... -
dubbo源码学习(二) : spring 自定义标签
2018-04-09 20:29 636做dubbo的配置时很容易发现,dubbo有一套自己的标签,提 ... -
Dubbo多注册中心和Zookeeper服务的迁移
2018-04-06 08:58 1506一、Dubbo多注册中心 1、 应用场景 例如阿里有些服务 ... -
dubbo源码学习一:基础知识及使用的相关技术
2018-04-05 20:10 692Dubbo是Alibaba开源的分布式服务框架,它最大的特点是 ... -
worker模式
2018-03-29 20:16 636今天来学学,大家也好对线程池有一个更好的理解。 public ... -
线程各种状态转移分析
2018-03-28 22:13 901线程在它的生命周期 ... -
生产者-消费者模式实现
2018-03-26 22:45 1161生产者是指:生产数据的线程 消费者是指:使用数据的线程 生产者 ... -
对find xargs grep和管道的深入理解
2018-03-24 22:14 768问题: 相信大家都知道在目录中搜索含有固定字符串文件的命令: ... -
java并发之同步辅助类Phaser
2018-03-19 21:46 1106Phaser含义: 更加复杂和强大的同步辅助类。它允许并发执 ... -
java并发之同步辅助类semaphore
2018-03-14 21:24 782semaphore(seməˌfôr)含义: 信号量就是可以 ... -
MySQL常用命令
2018-03-13 22:09 7771、查看数据库状态 及 ... -
Tomcat 集群 文件上传下载的共享问题 NFS配置
2018-03-12 21:50 664Tomcat 集群时上传文件时如何使得多部tomcat中的文件 ...
相关推荐
3. **CyclicBarrier**和**CountDownLatch**: 这两个都是同步辅助类,用于控制多个线程间的协作。CyclicBarrier允许一组线程等待所有线程到达某个屏障点后再继续执行,而CountDownLatch则允许一个线程等待其他指定...
Java并发工具包中包含了一些同步辅助类,如Semaphore(信号量)、CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)。它们帮助协调多线程间的协作,控制线程的并发访问数量或等待特定条件。 六、FutureTask...
Java并发编程中的栅栏(CyclicBarrier)是一个同步辅助类,它允许一组线程等待彼此到达某个特定点,然后一起继续执行。这个特定点被称为屏障点。与闭锁(CountDownLatch)不同,闭锁通常是一次性的,而CyclicBarrier...
Java并发工具辅助类代码实例 Java并发工具辅助类代码实例主要介绍了Java并发...CountDownLatch和CyclicBarrier都是Java并发工具辅助类的重要组成部分,它们能够帮助开发者更好地管理多线程,提高程序的性能和可靠性。
Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 ...CountDownLatch、CyclicBarrier和Semaphore都是Java并发编程中非常重要的辅助类,它们可以帮助开发者更好地进行并发编程。
5. **CountDownLatch**:这个同步辅助类允许一个或多个线程等待其他线程完成操作。通常用于初始化阶段,主线程等待所有子线程完成后再继续执行。 6. **CyclicBarrier**:允许一组线程相互等待,直到所有线程都到达...
另外,`CountDownLatch`, `CyclicBarrier`, `Semaphore`等同步辅助类也是并发编程中常用的工具,它们有助于实现复杂的同步策略。 对于并发编程中的死锁、活锁和饥饿问题,书中给出了详细的分析和解决方案。读者还将...
1. **CyclicBarrier**:`CyclicBarrier`是一个同步辅助类,允许一组线程等待彼此到达一个公共屏障点。在所有线程都到达屏障后,屏障点被重置,然后线程可以继续执行。例如,`TestCyclicBarrier`和`TestCyclicBarrier...
`CyclicBarrier`是另一个同步辅助类,允许一组线程等待其他线程到达屏障点再继续执行。在`Demo_CyclicBarrier.java`中,我们可以看到如何设定屏障点,所有线程必须到达此点才能继续。CyclicBarrier还可以执行一个回...
CountDownLatch和CyclicBarrier是同步辅助类,用于协调多个线程的执行,而Semaphore用于控制对共享资源的访问数量。 此外,书中还会详细讨论锁和同步机制,如synchronized关键字、volatile变量、读写锁...
`Phaser`是更为灵活的同步辅助类,可以实现类似功能并支持自定义回退行为。 另外,Java 7对`ExecutorService`接口进行了扩展,引入了`Executors`工具类,方便创建不同类型的线程池,如`FixedThreadPool`、`...
`CyclicBarrier`和`CountDownLatch`是两种重要的同步辅助类,前者用于一组线程等待彼此到达某个屏障点后一起继续执行,后者则用于一次性计数器,让一个或多个线程等待其他线程完成后再继续执行。 最后,`java.util....
- **CountDownLatch**:一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。当计数器的值减至零时,等待线程继续执行。 - **CyclicBarrier**:允许一组线程相互等待,直到到达某个公共屏障点。不同于`...
- **CountDownLatch、CyclicBarrier和Semaphore**:这些同步辅助类在多线程协调中的应用,如计数器、栅栏和信号量。 - **Future和Callable**:描述了异步计算的实现,如何获取结果和取消任务。 5. **并发集合** ...
在这个场景下,`MutiThreadTest.java` 文件可能是用于实现并发测试的代码,而 `GroboUtils-5-core.jar` 包可能包含了辅助进行并发测试或处理并发问题的工具类。 首先,我们需要理解Java并发的基础。Java提供了一...
CyclicBarrier 是 Java 并发编程中的一个同步辅助工具,它允许一组线程全部等待彼此到达公共屏障点。它的字面意思是可循环使用的屏障,用于让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会...
`CountDownLatch`是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。通过调用`await()`方法,当前线程会等待,直到计数器的值减少到零。这通常用于实现多线程之间的同步等待机制。 ##### 3.3 ...
`CountDownLatch`是一个同步辅助类,用来等待一组操作的完成。它通常用于实现多个线程等待一个或多个事件的发生。 ```java CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i ; i++) { new Thread...
10. **CyclicBarrier**和**CountDownLatch**:这两个类是同步辅助工具,用于协调多个线程的执行。CyclicBarrier允许一组线程等待其他线程到达某个点后一起继续,CountDownLatch则让线程等待计数器归零后才能继续。 ...