`

并发:CyclicBarrier的使用

 
阅读更多
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的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    Java并发实例之CyclicBarrier的使用

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

    CyclicBarrier的用法

    总结来说,`CyclicBarrier`是Java并发库中一种强大的工具,它可以帮助开发者实现复杂线程间的协调和同步,确保多个线程按照预期顺序执行。理解和熟练使用`CyclicBarrier`对于优化多线程应用程序的性能和逻辑是非常...

    Java并发编程:设计原则与模式(第二版)-3

    10. **并发编程最佳实践**:书中总结了在实际开发中应遵循的并发编程最佳实践,如最小化共享状态、避免阻塞、使用并发工具而非同步原语等。 通过对这些知识点的深入理解和应用,开发者可以编写出高效、安全的并发...

    java线程并发cyclicbarrier类使用示例

    总结来说,`CyclicBarrier`是Java并发编程中的一种高级工具,能够帮助开发者实现复杂的同步策略,比如在所有线程完成预处理工作后一起执行下一步操作。它在多线程协作场景下,如分布式计算、并行任务调度等,有着...

    java并发之并发工具类

    Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 Exchanger。 一、CyclicBarrier CyclicBarrier 是一种同步工具,允许一组线程互相等待,直到到达某个公共屏障点...

    java并发编程:设计原则与模式.rar

    Java并发工具类库(java.util.concurrent)是并发编程中的另一个重要主题,包括Atomic类(提供原子操作)、Semaphore(信号量)、CountDownLatch(计数器门锁)、CyclicBarrier(循环栅栏)和Exchanger(交换器)等...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

    Java并发系列之CyclicBarrier源码分析

    Java并发系列之CyclicBarrier源码分析 CyclicBarrier是Java并发系列中的一种同步工具类,用于实现一组线程相互等待。当所有线程都到达某个屏障点后,再进行后续的操作。下面是对CyclicBarrier源码的详细分析。 ...

    Java并发编程:设计原则与模式(第二版)-3PDF

    - **并发测试**:使用工具如JMeter进行并发性能测试,找出瓶颈。 以上知识点构成了《Java并发编程:设计原则与模式(第二版)》的主要内容,通过学习和实践这些知识,开发者可以更好地设计和实现高并发、高性能的...

    Java并发编程(CyclicBarrier)实例详解

    Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

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

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

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

    2. **CyclicBarrier的使用**: - **构造器**:创建CyclicBarrier时需要指定线程数量n和可选的屏障动作。屏障动作会在所有线程都到达屏障点后执行。 - **await方法**:每个线程在到达屏障点时调用await方法,这会...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    5. **原子类与并发工具类**:介绍了java.util.concurrent.atomic包中的原子类,如AtomicInteger、AtomicLong等,以及Semaphore、CountDownLatch、CyclicBarrier等并发工具类的使用场景和最佳实践。 6. **线程通信**...

    Java 并发编程:设计原则与模式

    4. **双端队列(Bounded Buffer)**:使用两个等待条件实现满队列和空队列的同步,如Java的LinkedBlockingDeque。 5. **读写锁模式**:允许多个读取者同时访问资源,但限制写入者独占资源。ReentrantReadWriteLock...

    java 并发编程的艺术pdf清晰完整版 源码

    此外,书中还会涵盖其他并发工具类,如Semaphore、CyclicBarrier等。 7. **并发异常处理**:在并发编程中,正确处理异常是非常重要的,书中会讲解如何在多线程环境中优雅地处理异常。 8. **JVM内存模型与并发**:...

    java高并发程序设计(原版电子书)

    5. **并发工具类**:介绍`CountDownLatch`、`CyclicBarrier`、`Semaphore`和`Exchanger`等并发工具类,用于协调多个线程间的同步和协作。 6. **并发设计模式**:讨论适用于并发编程的设计模式,如生产者-消费者模式...

    Java并发编程的设计原则与模式

    4. **非阻塞并发**:使用非阻塞算法,如CAS(Compare and Swap),可以在无锁的情况下实现并发,提高系统性能。 5. **避免长时间持有锁**:减少线程持有锁的时间,降低发生竞争的概率。 三、并发编程模式 1. **生产...

Global site tag (gtag.js) - Google Analytics