栅栏(Barrier)
栅栏(Barrier):如果说CountDownLatch是一扇打开了就永远关不上的门,那么栅栏就是一扇能反反复复打开关闭的门。例如:大家应该都跟过团去旅游,早上,大家陆陆续续来到出发点集合乘车等待出发,导游清点人头后出发,到达景区后大家自由活动,然后回到集合点集合上车准备前往下一个景点。
API如下:
// 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动
// barrier 时执行预定义的操作。
public CyclicBarrier(int parties)
// 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时
// 执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
public CyclicBarrier(int parties, Runnable barrierAction)
// 在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
public int await() throws InterruptedException, BrokenBarrierException
// 在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。
public int await(long timeout,TimeUnit unit) throws InterruptedException, BrokenBarrierException,TimeoutException
// 返回当前在屏障处等待的参与者数目。此方法主要用于调试和断言
public int getNumberWaiting() 。
// 返回要求启动此 barrier 的参与者数目。
public int getParties()
// 查询此屏障是否处于损坏状态。
public boolean isBroken()
// 将屏障重置为其初始状态。
public void reset()
下面代码示例了一个 CPU数+1(main线程)的Barrier:当CPU数线程启动完毕后,main线程通知Barrier进入等待状态,这时Barrier开放,之前启动的CPU数线程和主main线程继续执行,拦截的线程通过后,Barrier自动恢复,main线程启动的下一轮CPU线程全部被Barrier阻塞,直到Barrier再次开放。
/* * TestBarrier * * @author alchimie */ public class TestBarrier { private final CyclicBarrier barrier; private final int runNum; private final Random random = new Random(); private final int nCpu; public TestBarrier(int runNum) { this.nCpu = Runtime.getRuntime().availableProcessors(); System.out.println("本机CPU为: " + nCpu + " 栅栏限制线程数为:" + (nCpu + 1)); barrier = new CyclicBarrier(nCpu + 1, new worker( "Thread-worker")); this.runNum = runNum; } private class worker implements Runnable { private final String name; public worker(String name) { this.name = name; } public void run() { System.out.println(name + " 栅栏开放"); } } private class randomIntWorker implements Runnable { public void run() { try { System.out.println(Thread.currentThread().getName() + " 到达栅栏"); barrier.await(); int randomVal = random.nextInt(10); System.out.println(Thread.currentThread().getName() + " 取得随机数:" + randomVal); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void execute() { for (int i = 0; i < nCpu * runNum; i++) { new Thread(new randomIntWorker()).start(); if ((i + 1) % nCpu == 0) { try { // 主线程等待栅栏 barrier.await(); } catch (InterruptedException e) { return; } catch (BrokenBarrierException e) { return; } } } } public static void main(String args[]) { // 设置执行两轮 TestBarrier tb = new TestBarrier(2); tb.execute(); } }
执行结果:
本机CPU为: 4 栅栏限制线程数为:5
Thread-0 到达栅栏
Thread-1 到达栅栏
Thread-2 到达栅栏
Thread-3 到达栅栏
Thread-worker 栅栏开放
Thread-3 取得随机数:5
Thread-2 取得随机数:9
Thread-0 取得随机数:4
Thread-1 取得随机数:4
Thread-4 到达栅栏
Thread-5 到达栅栏
Thread-6 到达栅栏
Thread-7 到达栅栏
Thread-worker 栅栏开放
Thread-7 取得随机数:6
Thread-4 取得随机数:8
Thread-6 取得随机数:9
Thread-5 取得随机数:1
相关推荐
3. **并发控制**:Java提供了多种并发控制工具,包括synchronized、wait()、notify()、notifyAll()、ReentrantLock(可重入锁)、Semaphore(信号量)和CountDownLatch(倒计时器)等。这些工具用于协调不同线程的...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的区别** - **线程** 是程序执行的最小单位,一个进程中可以有多个线程同时执行,共享同一块内存空间,通信...
62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...
《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...
3. **并发工具类**:Java并发包(java.util.concurrent)包含了许多工具类,如Semaphore(信号量)、CyclicBarrier(回环屏障)、CountDownLatch(计数器门锁)和ThreadPoolExecutor(线程池)。这些工具可以帮助...
第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 ...
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容
3. **锁**:Java中的锁机制包括内置锁(监视器锁)和显式锁。内置锁通过`synchronized`实现,而显式锁如`Lock`接口及其实现(如`ReentrantLock`)提供了更高级的功能,如可中断、公平性和尝试获取锁。 4. **并发...
7. Java内置锁和锁的粒度:Java中的`synchronized`关键字用于实现内置锁,它保证了线程对共享资源的互斥访问。关于锁的粒度,需要根据实际情况来决定是使用细粒度还是粗粒度的锁。使用同步时,需要考虑代码同步块的...
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括线程安全类设计、实例封闭、线程安全性委托、现有线程安全类中添加功能和文档化同步策略等内容
《java并发编程实战》读书笔记-第2章-线程安全性,脑图形式,使用xmind8制作 包括引言、线程安全性定义、原子性、加锁机制、使用锁保护状态、活跃性与性能等内容
3. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和Exchanger(交换器)等,这些都是Java并发库提供的重要工具,用于实现复杂的同步和协作机制。 4. **并发集合**...