`

并发编程回顾:循环阻断器CyclicBarrier

 
阅读更多

原先多线程并发编程的学习笔记和代码整理一下贴上来。

---------------------------------

循环阻断器CyclicBarrier

CyclicBarrier(循环栅栏):没有找到合适的名字,这里自己翻译成循环阻断器。

感觉这个工具类其实和CountDownLatch很像,不同的是CountDownLatch是等待一组其它线程,CyclicBarrier是一组线程相互等待。而且CountDownLatch是通过计数停止等待(计数为0时,才会继续执行),而CyclicBarrier是在所有线程都调用了await()后才会继续执行的。

根据JDK文档中描述:

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier

下面是一个跑步比赛的例子。

所有选手先上跑道,热身,准备好后,才开始比赛。所有选手都到达终点后,比赛才结束。

首先定义一个选手类:

class Player implements Runnable{
	private String playerName;
	private CyclicBarrier begin;
	private CyclicBarrier end;
	public Player(String playerName,CyclicBarrier begin,CyclicBarrier end){
		super();
		this.begin=begin;
		this.end=end;
		this.playerName=playerName;
	}
	@Override
	public void run() {
		try {
			System.out.println("参赛者"+playerName+"上跑道...");
			System.out.println("参赛者"+playerName+"热身...");
			System.out.println("参赛者"+playerName+"准备完毕!");
			begin.await();
			int time=new Random().nextInt(15)+5;
			Thread.sleep(time*1000);
			System.out.println("参赛者"+playerName+"到达终点!用时:"+time+"s");
			end.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}
}

定义了两个阻断器,一个用于开始比赛,一个用于结束比赛。

比赛全程实况转播大笑

CyclicBarrier begin = new CyclicBarrier(N,new Runnable() {
	@Override
	public void run() {
		System.out.println("砰!比赛开始!");
	}
});
CyclicBarrier end = new CyclicBarrier(N,new Runnable() {
	@Override
	public void run() {
		System.out.println("全场比赛结束!");
	}
});
ExecutorService es = Executors.newFixedThreadPool(N);
for(int i=0;i<N;i++){
	es.execute(new Player(String.valueOf(i+1), begin, end));
}

注意这里定义的阻断器,首先指明全部参与者数量N,然后指定当启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。

最后,看一下比赛录像:

参赛者1上跑道...
参赛者1热身...
参赛者4上跑道...
参赛者4热身...
参赛者4准备完毕!
参赛者2上跑道...
参赛者2热身...
参赛者2准备完毕!
参赛者3上跑道...
参赛者3热身...
参赛者3准备完毕!
参赛者1准备完毕!
砰!比赛开始!
参赛者4到达终点!用时:8s
参赛者2到达终点!用时:10s
参赛者3到达终点!用时:14s
参赛者1到达终点!用时:18s
全场比赛结束!
分享到:
评论

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下世界.mp4 │ 高并发编程第二阶段50讲、ClassLoader父委托机制详细介绍.mp4 │ 高并发编程第二阶段51讲、加密解密类加载实战演示.mp4 │ 高...

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

    主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下

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

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

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

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

    Java 并发编程原理与实战视频

    java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下世界.mp4 │ 高并发编程第二阶段50讲、ClassLoader父委托机制详细介绍.mp4 │ 高并发编程第二阶段51讲、加密解密类加载实战演示.mp4 │ 高...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    Java并发编程基础.pdf

    Java并发编程基础主要包括以下几个核心方面: ...并发工具类:掌握Java并发包java.util.concurrent中提供的各种工具类,如CountDownLatch、CyclicBarrier、Semaphore等,它们简化了并发编程的复杂性。

    Java并发编程(22)并发新特性-障碍器CyclicBa

    Java并发编程(22)并发新特性—障碍器CyclicBarrier(含代码)编程开发技术共3页.pdf.zip

    Java并发编程原理与实战

    并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask使用.mp4 Future设计模式实现(实现...

    龙果java并发编程完整视频

    第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57...

    Java并发编程相关技术使用案例

    1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...

    Java并发编程学习笔记

    7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...

    java并发编程

    第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57...

    并发编程笔记20190526.docx

    2、CyclicBarrier 28 3、Semaphore 29 4、Callable、Future和FutureTask 30 5、原子操作CAS (compare atomic swap) 32 三、显式锁和AQS 34 1、AQS定义两种资源共享方式: 34 2、深入源码 37 3、了解Condition的实现 ...

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

    主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。

    Java中的CyclicBarrier类最全讲义

    1.1 并发编程与线程协作 1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 3.1 场景介绍 3.2 使用CyclicBarrier控制线程协作 循环使用CyclicBarrier 4.1...

    CountDownLatch和CyclicBarrier用法实例大全

    《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法

Global site tag (gtag.js) - Google Analytics