`
chenzehe
  • 浏览: 538196 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

同步工具类之CyclicBarrier循环的barrier

 
阅读更多

     CyclicBarrier在java.util.concurrent包下,是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

构造方法

public CyclicBarrier(int parties)创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。 
参数:parties - 在启动 barrier 前必须调用 await() 的线程数 
抛出:IllegalArgumentException - 如果 parties 小于 1

public CyclicBarrier(int parties,
                     Runnable barrierAction)创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
参数:parties - 在启动 barrier 前必须调用 await() 的线程数
barrierAction - 在启动 barrier 时执行的命令;如果不执行任何操作,则该参数为 null 
抛出:IllegalArgumentException - 如果 parties 小于 1

方法摘要

 int await() 
          在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 
 int await(long timeout, TimeUnit unit) 
          在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。 
 int getNumberWaiting() 
          返回当前在屏障处等待的参与者数目。 
 int getParties() 
          返回要求启动此 barrier 的参与者数目。 
 boolean isBroken() 
          查询此屏障是否处于损坏状态。 
 void reset() 
          将屏障重置为其初始状态。 

 

如下代码演示赛跑,等到barrier上所有线程都调用await方法后才往下执行:

/**
 * Huisou.com Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */

package thread;

import java.io.IOException;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @description
 * 
 * @author chenzehe
 * @email hljuczh@163.com
 * @create 2013-1-11 下午03:04:06
 */

public class CyclicBarrierTest {
	
	public static void main(String[] args) throws IOException, InterruptedException {
		CyclicBarrier barrier = new CyclicBarrier(3);
		new Thread(new Runner(barrier, "1号选手")).start();
		new Thread(new Runner(barrier, "2号选手")).start();
		new Thread(new Runner(barrier, "3号选手")).start();
	}
}

class Runner implements Runnable {
	private CyclicBarrier	barrier;
	
	private String			name;
	
	public Runner(CyclicBarrier barrier, String name) {
		super();
		this.barrier = barrier;
		this.name = name;
	}
	
	@Override
	public void run() {
		try {
			Thread.sleep(3000);
			System.out.println(name + " 准备好了...");
			// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
			barrier.await();
			System.out.println(name + " 起跑!");
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
		
	}
}

1号选手 准备好了...
3号选手 准备好了...
2号选手 准备好了...
1号选手 起跑!
3号选手 起跑!
2号选手 起跑! 

 

 

分享到:
评论

相关推荐

    Java中的CyclicBarrier类最全讲义

    与`Semaphore`、`CountDownLatch`等其他同步工具不同的是,`CyclicBarrier`是可循环使用的。也就是说,在所有线程通过屏障后,它可以被重置,以供后续的循环使用。这一特性使得`CyclicBarrier`在需要重复执行相同...

    CyclicBarrier的用法

    在Java多线程编程中,`CyclicBarrier`是一个非常重要的同步工具类,它允许一组线程等待其他线程到达某个屏障点后再一起继续执行。这个屏障点就是我们所说的“循环栅栏”,顾名思义,它就像一个旋转门,所有线程必须...

    Java并发实例之CyclicBarrier的使用

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

    并发工具类及线程池1

    本节主要讨论的是CyclicBarrier,一个用于同步线程的工具类。 **CyclicBarrier简介** CyclicBarrier是一个Java并发包(java.util.concurrent)中的同步辅助类,其主要功能是让一组线程相互等待,直到所有线程都达到...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    总结来说,CountDownLatch和CyclicBarrier虽然都是同步工具,但在实现和使用上有所不同。CountDownLatch关注的是一个单一的计数,当计数归零时,所有等待的线程都被释放,常用于一次性同步事件。而CyclicBarrier关注...

    java并发编程专题(九)----(JUC)浅析CyclicBarrier

    Java 并发编程专题(九)----(JUC)浅析 CyclicBarrier CyclicBarrier 是 Java 并发...CyclicBarrier 是一个非常有用的同步辅助工具,能够让多个线程之间进行协调,并且可以重复使用,因此它被称为是循环的 barrier。

    java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    `java.util.concurrent`包是Java提供的一个强大的多线程工具库,其中包含了许多类和接口,如`CountDownLatch`和`CyclicBarrier`,它们为程序员提供了更高级别的同步和协调机制。这篇文档将详细解析这两个工具类的...

    Java线程并发工具类CountDownLatch原理及用法

    Barrier,中文可译为循环屏障或回环栅栏,它是一个多线程同步工具,用于让一组线程等待其他线程到达某个屏障点。在所有线程到达屏障点后,屏障点会释放,允许所有线程继续执行。CyclicBarrier的名字来源于它的可重用...

    所以线程都停止后再干些事情

    这些工具类使得在多线程环境中控制线程执行顺序和同步变得更加容易。实际开发中,应根据需求选择最适合的同步机制,避免死锁、饥饿等问题,保证程序的稳定性和效率。通过阅读源码,我们可以更深入地理解这些工具的...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...

    JAVA并发编程实践

    Java提供了`java.util.concurrent.atomic`包下的原子类,如`AtomicInteger`、`AtomicLong`等,这些类提供了线程安全的原子操作,避免了显式同步带来的性能开销。 #### 四、高级并发技术 ##### 4.1 线程池 线程池是...

Global site tag (gtag.js) - Google Analytics