下面是一个 线程相互等待,都到达某一点后,继续开始执行任务的例子(测试CyclicBarrier)。
这里模拟了这样一个场景: 3个玩家同时进行通关游戏,当他们都到达或通过某一关后,才可继续往下过关。比如张三、李四、王五,他们通过每一关的时间都不相同,但是他们都必须都通关了第一关后,才能开始玩第二关;都通过了第二关,才能玩第三关... ...
写了3个类来验证这种情况,只在windows下做了测试。
1.1、GameBarrier.java 游戏关卡
1.2、GameBarrierTask.java 通关任务
1.3、GameBarrierTest.java 带有main方法的测试类,三个选手开始play game
================= 1.1 GameBarrier.java =====================
package Executor;
//游戏关卡
public class GameBarrier {
//关名称
private String barrierName;
//玩家通关时间
private int passTime;
private GameBarrier(){}
public GameBarrier(String barrierName, int passTime){
if(barrierName == null || barrierName.trim().length() == 0)
this.barrierName = "默认关";
else
this.barrierName = barrierName;
if(passTime < 1)
this.passTime = Integer.MAX_VALUE;//无限大,表示不通关
else
this.passTime = passTime;
}
public String getBarrierName() {
return barrierName;
}
public int getPassTime() {
return passTime;
}
}
========================= 1.1 end ==========================
================= 1.2 GameBarrierTask.java =====================
package Executor;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
//通关任务
public class GameBarrierTask implements Runnable {
//游戏关集合
private List<GameBarrier> gameBarriers;
//玩家名称
private String gamePlayer;
//通关控制器
private CyclicBarrier cyclicBarrier;
private GameBarrierTask() {}
public GameBarrierTask(List<GameBarrier> gameBarriers, String gamePlayer, CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
this.gameBarriers = gameBarriers;
this.gamePlayer = gamePlayer;
}
//获得当前时间
private String currenttime() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
return sdf.format(new Date()) + ": ";
}
public void run() {
try {
for (GameBarrier gameBarrier : gameBarriers) {
Thread.sleep(gameBarrier.getPassTime() * 1000);
System.out.println(currenttime() + gamePlayer + " passed game barrier " + gameBarrier.getBarrierName());
cyclicBarrier.await();
}
} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
}
}
}
========================= 1.2 end ==========================
================= 1.3 GameBarrierTest.java =====================
package Executor;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//对CyclicBarrier的测试(线程相互等待,直到都达到某一个点,然后开始继续执行)
//这个测试类进行的是:3个玩家同时进行通关游戏,当他们都到达或通过某一关后,才可以
//继续往下过关
public class GameBarrierTest {
public static void main(String[] args) {
// 建立一个带有三个玩家的通关控制器
CyclicBarrier barrier = new CyclicBarrier(3);
// 为玩家1建立通关任务
List<GameBarrier> gameBarrier1 = new ArrayList<GameBarrier>(4);
gameBarrier1.add(new GameBarrier("第一关",5));
gameBarrier1.add(new GameBarrier("第二关",2));
gameBarrier1.add(new GameBarrier("第三关",8));
gameBarrier1.add(new GameBarrier("第四关",6));
GameBarrierTask task1 = new GameBarrierTask(gameBarrier1, "张三", barrier);
// 为玩家2建立通关任务
List<GameBarrier> gameBarrier2 = new ArrayList<GameBarrier>(4);
gameBarrier2.add(new GameBarrier("第一关",1));
gameBarrier2.add(new GameBarrier("第二关",6));
gameBarrier2.add(new GameBarrier("第三关",3));
gameBarrier2.add(new GameBarrier("第四关",8));
GameBarrierTask task2 = new GameBarrierTask(gameBarrier2, "李四", barrier);
// 为玩家3建立通关任务
List<GameBarrier> gameBarrier3 = new ArrayList<GameBarrier>(4);
gameBarrier3.add(new GameBarrier("第一关",7));
gameBarrier3.add(new GameBarrier("第二关",6));
gameBarrier3.add(new GameBarrier("第三关",4));
gameBarrier3.add(new GameBarrier("第四关",3));
GameBarrierTask task3 = new GameBarrierTask(gameBarrier3, "王五", barrier);
//建立线程池,执行游戏通关任务
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(task1);
executorService.submit(task2);
executorService.submit(task3);
//关闭线程池
executorService.shutdown();
}
}
========================= 1.3 end ==========================
输出如下:
10:07:10: 李四 passed game barrier 第一关
10:07:13: 张三 passed game barrier 第一关
10:07:15: 王五 passed game barrier 第一关
10:07:17: 张三 passed game barrier 第二关
10:07:21: 王五 passed game barrier 第二关
10:07:21: 李四 passed game barrier 第二关
10:07:24: 李四 passed game barrier 第三关
10:07:25: 王五 passed game barrier 第三关
10:07:29: 张三 passed game barrier 第三关
10:07:32: 王五 passed game barrier 第四关
10:07:35: 张三 passed game barrier 第四关
10:07:37: 李四 passed game barrier 第四关
http://whitesock.iteye.com/blog/162350
public class Solver {
//
private final String[][] data;
private final CyclicBarrier barrier;
private final CountDownLatch latch;
public Solver(String[][] data) {
this.data = data;
this.barrier = new CyclicBarrier(data.length, new BarrierAction());
this.latch = new CountDownLatch(data.length);
}
public void start() {
//
for (int i = 0; i < data.length; ++i) {
new Thread(new Worker("worker" + i, this.data[i])).start();
}
//
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
String[][] data = new String[][]{{"a1", "a2", "a3"}, {"b1", "b2", "b3"}, {"c1", "c2", "c3"}};
Solver solver = new Solver(data);
solver.start();
}
private class BarrierAction implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName() + " is processing barrier action");
}
}
private class Worker implements Runnable {
//
private String name;
private String[] row;
Worker(String name, String[] row) {
this.name = name;
this.row = row;
}
public void run() {
for(int i = 0; i < row.length; i++) {
System.out.println(name + " is processing row[" + i +"]" + row[i]);
try {
barrier.await();
} catch (InterruptedException ex) {
break;
} catch (BrokenBarrierException ex) {
break;
}
}
//
latch.countDown();
}
}
}
在这个例子中,每个 worker 线程处理矩阵的一行,在处理完所有的行之前,该线程将一直在屏障处等待。处理完所有的行之后,将执行所提供的 Runnable 屏障操作,并合并这些行。CountDownLatch等待所有线程结束,继续执行主线程!
分享到:
相关推荐
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...
在Java多线程编程中,`CyclicBarrier`是一个非常重要的同步工具类,它允许一组线程等待其他线程到达某个屏障点后再一起继续执行。这个屏障点就是我们所说的“循环栅栏”,顾名思义,它就像一个旋转门,所有线程必须...
CyclicBarrier的使用以及注意事项
用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620
在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...
CyclicBarrier是Java并发编程中一个非常重要的工具类,它属于java.util.concurrent包,主要用于多线程间的协作,尤其在需要多个线程等待彼此完成特定任务后才能继续执行的场景中发挥着关键作用。CyclicBarrier的名字...
# Java中的CyclicBarrier类最全讲义 ## 1. 简介 ### 1.1 并发编程与线程协作 在现代软件开发中,特别是高性能计算领域,利用多核处理器的能力变得至关重要。为了充分利用这些硬件资源,程序员们开始广泛采用并发...
《JAVA CyclicBarrier类详解》 CyclicBarrier是Java并发包(java.util.concurrent)中一个重要的同步辅助类,它的主要作用在于协调多个线程之间的协作,使得这些线程能够一起到达一个公共的“集结点”(称为屏障点...
CyclicBarrier 是 Java 并发库中的一种同步工具类,用于协调多个线程之间的协作,使得它们能够一起开始某个计算任务或操作。它的名称“CyclicBarrier”来源于它具有可重用的特点,即当所有等待的线程都达到指定的...
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
Java并发系列之CyclicBarrier源码分析 CyclicBarrier是Java并发系列中的一种同步工具类,用于实现一组线程相互等待。当所有线程都到达某个屏障点后,再进行后续的操作。下面是对CyclicBarrier源码的详细分析。 ...
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...
### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...
Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...
Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...
CyclicBarrier(处理方案示例).md
Java多线程之CyclicBarrier的使用方法 Java多线程之CyclicBarrier的使用方法是Java多线程编程中的一种同步机制,用于实现多个线程之间的同步协作。CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待...
Java中的`CyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点。这个屏障点就像一个交通信号灯,只有当所有的车辆(线程)都到达了交叉口,信号灯才会变为绿灯,允许它们...
java.CyclicBarrier(处理方案示例).md
Java 并发编程专题(九)----(JUC)浅析 CyclicBarrier CyclicBarrier 是 Java 并发编程中的一个同步辅助工具,它允许一组线程全部等待彼此到达公共屏障点。它的字面意思是可循环使用的屏障,用于让一组线程到达一...