`
alchimie
  • 浏览: 20457 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[Java并发编程实战] 读书笔记(3):栅栏

 
阅读更多

栅栏(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

 

分享到:
评论

相关推荐

    Java 并发编程实战.pdf

    《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...

    《java 并发编程实战高清PDF版》

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...

    java并发编程实战(英文版)

    ### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...

    Java并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...

    java并发编程实践pdf笔记

    这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的区别** - **线程** 是程序执行的最小单位,一个进程中可以有多个线程同时执行,共享同一块内存空间,通信...

    62-Java并发编程实战

    62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    java并发编程与实践

    3. **并发工具类**:Java并发包(java.util.concurrent)包含了许多工具类,如Semaphore(信号量)、CyclicBarrier(回环屏障)、CountDownLatch(计数器门锁)和ThreadPoolExecutor(线程池)。这些工具可以帮助...

    Java并发编程实战

    第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并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...

    《java并发编程实战》读书笔记-第3章-对象的共享

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容

    java并发编程实战高清版pdf

    3. **锁**:Java中的锁机制包括内置锁(监视器锁)和显式锁。内置锁通过`synchronized`实现,而显式锁如`Lock`接口及其实现(如`ReentrantLock`)提供了更高级的功能,如可中断、公平性和尝试获取锁。 4. **并发...

    读书笔记-Java并发编程实战-基础篇

    7. Java内置锁和锁的粒度:Java中的`synchronized`关键字用于实现内置锁,它保证了线程对共享资源的互斥访问。关于锁的粒度,需要根据实际情况来决定是使用细粒度还是粗粒度的锁。使用同步时,需要考虑代码同步块的...

    Java并发编程实战.pptx

    Java并发编程实战需要了解Java中的线程模型、锁机制、线程池、并发集合类等概念和技术,以及如何使用Java中的各种并发编程工具和框架来实现高效、可靠的并发编程。 Java并发编程实战的目标是提高程序的响应速度、...

    《java并发编程实战》读书笔记-第4章-对象的组合

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括线程安全类设计、实例封闭、线程安全性委托、现有线程安全类中添加功能和文档化同步策略等内容

    《java并发编程实战》读书笔记-第2章-线程安全性

    《java并发编程实战》读书笔记-第2章-线程安全性,脑图形式,使用xmind8制作 包括引言、线程安全性定义、原子性、加锁机制、使用锁保护状态、活跃性与性能等内容

    Java 并发编程实战 中英文+代码示例

    3. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和Exchanger(交换器)等,这些都是Java并发库提供的重要工具,用于实现复杂的同步和协作机制。 4. **并发集合**...

Global site tag (gtag.js) - Google Analytics