原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------
循环阻断器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 全场比赛结束!
相关推荐
│ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下世界.mp4 │ 高并发编程第二阶段50讲、ClassLoader父委托机制详细介绍.mp4 │ 高并发编程第二阶段51讲、加密解密类加载实战演示.mp4 │ 高...
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...
│ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下世界.mp4 │ 高并发编程第二阶段50讲、ClassLoader父委托机制详细介绍.mp4 │ 高并发编程第二阶段51讲、加密解密类加载实战演示.mp4 │ 高...
龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...
Java并发编程基础主要包括以下几个核心方面: ...并发工具类:掌握Java并发包java.util.concurrent中提供的各种工具类,如CountDownLatch、CyclicBarrier、Semaphore等,它们简化了并发编程的复杂性。
Java并发编程(22)并发新特性—障碍器CyclicBarrier(含代码)编程开发技术共3页.pdf.zip
并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask使用.mp4 Future设计模式实现(实现...
第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57...
1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...
7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...
第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节CountDownLatch,CyclicBarrier,Semaphore源码解析00:29:57...
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编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。
1.1 并发编程与线程协作 1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 3.1 场景介绍 3.2 使用CyclicBarrier控制线程协作 循环使用CyclicBarrier 4.1...
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法