CyclicBarrier:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
1、使用构造方法为:CyclicBarrier(int parties, Runnable barrierAction) :创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
注意:barrierAction只会执行一次
看一下《Think In Java》的例子:
赛马游戏:(这个例子仔细看看,是写的很不错的)。
class Horse implements Runnable {
private static int counter = 0;
private final int id = counter++;//马的编号
private int strides = 0;//步伐
private static Random rand = new Random(47);
private static CyclicBarrier barrier;
public Horse(CyclicBarrier b) {
barrier = b;
}
public synchronized int getStrides() {
return strides;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
strides += rand.nextInt(3);
}
barrier.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
public String toString() {
return "Horse : " + id;
}
public String tracks() {
StringBuilder s = new StringBuilder();
for (int i = 0; i < getStrides(); i++) {
s.append("*");
}
s.append(id);
return s.toString();
}
}
public class HorseRace {
static final int FINISH_LINE = 10;
private List<Horse> horses = new ArrayList<Horse>();
private ExecutorService exec = Executors.newCachedThreadPool();
private CyclicBarrier barrier;
public HorseRace(int nHorse, final int pause) {
barrier = new CyclicBarrier(nHorse, new Runnable() {
@Override
public void run() {
StringBuilder s = new StringBuilder();
for(int i = 0; i < FINISH_LINE; i++){
s.append("=");
}
System.out.println(s);
for(Horse horse : horses){
System.out.println(horse.tracks());
}
for(Horse horse : horses){
if(horse.getStrides() >= FINISH_LINE){
System.out.println(horse + " won!");
exec.shutdown();
return;
}
try {
TimeUnit.MILLISECONDS.sleep(pause);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("one time");
}
});
for(int i = 0; i < nHorse; i++){
Horse horse = new Horse(barrier);
horses.add(horse);
exec.execute(horse);
}
}
public static void main(String[] args){
int nHorses = 2;
int pause = 5;
new HorseRace(nHorses, pause);
}
}
2、构造方法为:CyclicBarrier(int parties) :创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。
注意:这个构造,barrier的计数为0时,没有其他统一的动作,各个线程会各自执行剩下的代码。比如下面的代码,若有5个线程相互等待,当barrier的计数为0时,将输出5次hello:
public void run() {
try {
barrier.await();
System.out.println("hello");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
分享到:
相关推荐
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...
总结来说,`CyclicBarrier`是Java并发库中一种强大的工具,它可以帮助开发者实现复杂线程间的协调和同步,确保多个线程按照预期顺序执行。理解和熟练使用`CyclicBarrier`对于优化多线程应用程序的性能和逻辑是非常...
10. **并发编程最佳实践**:书中总结了在实际开发中应遵循的并发编程最佳实践,如最小化共享状态、避免阻塞、使用并发工具而非同步原语等。 通过对这些知识点的深入理解和应用,开发者可以编写出高效、安全的并发...
总结来说,`CyclicBarrier`是Java并发编程中的一种高级工具,能够帮助开发者实现复杂的同步策略,比如在所有线程完成预处理工作后一起执行下一步操作。它在多线程协作场景下,如分布式计算、并行任务调度等,有着...
Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 Exchanger。 一、CyclicBarrier CyclicBarrier 是一种同步工具,允许一组线程互相等待,直到到达某个公共屏障点...
Java并发工具类库(java.util.concurrent)是并发编程中的另一个重要主题,包括Atomic类(提供原子操作)、Semaphore(信号量)、CountDownLatch(计数器门锁)、CyclicBarrier(循环栅栏)和Exchanger(交换器)等...
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...
Java并发系列之CyclicBarrier源码分析 CyclicBarrier是Java并发系列中的一种同步工具类,用于实现一组线程相互等待。当所有线程都到达某个屏障点后,再进行后续的操作。下面是对CyclicBarrier源码的详细分析。 ...
- **并发测试**:使用工具如JMeter进行并发性能测试,找出瓶颈。 以上知识点构成了《Java并发编程:设计原则与模式(第二版)》的主要内容,通过学习和实践这些知识,开发者可以更好地设计和实现高并发、高性能的...
Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...
2. **CyclicBarrier的使用**: - **构造器**:创建CyclicBarrier时需要指定线程数量n和可选的屏障动作。屏障动作会在所有线程都到达屏障点后执行。 - **await方法**:每个线程在到达屏障点时调用await方法,这会...
本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...
5. **原子类与并发工具类**:介绍了java.util.concurrent.atomic包中的原子类,如AtomicInteger、AtomicLong等,以及Semaphore、CountDownLatch、CyclicBarrier等并发工具类的使用场景和最佳实践。 6. **线程通信**...
4. **双端队列(Bounded Buffer)**:使用两个等待条件实现满队列和空队列的同步,如Java的LinkedBlockingDeque。 5. **读写锁模式**:允许多个读取者同时访问资源,但限制写入者独占资源。ReentrantReadWriteLock...
此外,书中还会涵盖其他并发工具类,如Semaphore、CyclicBarrier等。 7. **并发异常处理**:在并发编程中,正确处理异常是非常重要的,书中会讲解如何在多线程环境中优雅地处理异常。 8. **JVM内存模型与并发**:...
5. **并发工具类**:介绍`CountDownLatch`、`CyclicBarrier`、`Semaphore`和`Exchanger`等并发工具类,用于协调多个线程间的同步和协作。 6. **并发设计模式**:讨论适用于并发编程的设计模式,如生产者-消费者模式...
4. **非阻塞并发**:使用非阻塞算法,如CAS(Compare and Swap),可以在无锁的情况下实现并发,提高系统性能。 5. **避免长时间持有锁**:减少线程持有锁的时间,降低发生竞争的概率。 三、并发编程模式 1. **生产...