java并发之同步工具类三之栅栏Barrier
2017-12-24 15:15
295 查看
栅栏跟闭锁是有同样的功能的,都可以让所有线程都阻塞在同一个位置。唯一不同的是,闭锁等待的是事件,而栅栏等待的是一起执行的其他线程。
在之前的博客中 java并发之同步工具类一之闭锁Latch引用了一个赛跑案例,运动员相当于多个并发的子线程,而裁判就是主线程。运动员的就绪等待的是裁判起跑枪指令(即一个事件),当起跑枪发射所有运动员就同时开始跑。这是闭锁的实现方式,而栅栏不同,它没有裁判这个角色,它是观察并等待所有一起跑的运动员都准备就绪后开始跑。这种场景显示中可能会更常见,如几个好朋友约定3点半在广州图书馆门口相见,到了3点半如果有一人没到,其他人就一起等待。这种场景,就是没有裁判这个角色的,等待不是一个事件,而是所有朋友。
栅栏还有个不同,如果其中有一个线程超时或者中止,所有线程都将会终止并抛出BrokenBarrierException,因为没有事件指令,只能通过其他线程共同来维护,一个线程不能就绪其他也就都失败。而这个,就能确保了其他线程也都全部完成了上面的步骤。
我们依旧使用原来的跑步案例,更改起跑限制为栅栏,实现如下
同样的,执行结果与闭锁一样。
在之前的博客中 java并发之同步工具类一之闭锁Latch引用了一个赛跑案例,运动员相当于多个并发的子线程,而裁判就是主线程。运动员的就绪等待的是裁判起跑枪指令(即一个事件),当起跑枪发射所有运动员就同时开始跑。这是闭锁的实现方式,而栅栏不同,它没有裁判这个角色,它是观察并等待所有一起跑的运动员都准备就绪后开始跑。这种场景显示中可能会更常见,如几个好朋友约定3点半在广州图书馆门口相见,到了3点半如果有一人没到,其他人就一起等待。这种场景,就是没有裁判这个角色的,等待不是一个事件,而是所有朋友。
栅栏还有个不同,如果其中有一个线程超时或者中止,所有线程都将会终止并抛出BrokenBarrierException,因为没有事件指令,只能通过其他线程共同来维护,一个线程不能就绪其他也就都失败。而这个,就能确保了其他线程也都全部完成了上面的步骤。
我们依旧使用原来的跑步案例,更改起跑限制为栅栏,实现如下
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; /** * * @author Jerry 自由比赛与CycleBarrier * @date 2017/12/24 0024 */ public class SelfMatch { public static void main(String[] args) { int joinMatchCnt = 5;//参加比赛的人数 CyclicBarrier beginMatchFlag = new CyclicBarrier(joinMatchCnt); CountDownLatch finishFlag = new CountDownLatch(joinMatchCnt); System.out.println("比赛准备开始....."); for (int i = 1; i <= joinMatchCnt; i++) { Thread t = new Thread(new Sportsman(beginMatchFlag, finishFlag, i + "号")); System.out.println(i + "号已就位"); t.start();//所有运动员都到指定位置就绪 } try { finishFlag.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("比赛结束....."); } static class Sportsman implements Runnable { private CyclicBarrier beginMatchFlag; private CountDownLatch finishFlag; private String name; public Sportsman(CyclicBarrier beginMatchFlag, CountDownLatch finishFlag, String name) { this.beginMatchFlag = beginMatchFlag; this.finishFlag = finishFlag; this.name = name; } @Override public void run() { try { beginMatchFl 9edd ag.await();//等待所有队员就绪完毕 try { running(); } finally { System.out.println("运动员" + name + "跑到终点线"); finishFlag.countDown();//运动员跑到终点,这里要放在finally中,如运动员跑步受伤,立即终止个人成绩 } } catch (BrokenBarrierException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } private void running() { try { System.out.println("运动员" + name + "开始比赛"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
同样的,执行结果与闭锁一样。
比赛准备开始..... 1号已就位 2号已就位 3号已就位 4号已就位 5号已就位 运动员5号开始比赛 运动员4号开始比赛 运动员3号开始比赛 运动员2号开始比赛 运动员1号开始比赛 运动员4号跑到终点线 运动员5号跑到终点线 运动员2号跑到终点线 运动员1号跑到终点线 运动员3号跑到终点线 比赛结束.....
相关文章推荐
- Java并发编程之2——同步工具类的使用(CountDownLatch,CyclicBarrier,BlockungQueue,Semaphore)
- Java高并发程序-Chapter3 JDK并发包(第十五讲)同步控制之CyclicBarrier 循环栅栏
- Java并发:同步工具类详解(CountDownLatch、CyclicBarrier、Semaphore)
- Java同步工具类——栅栏[CyclicBarrier]
- Java多线程-并发工具类(一)同步屏障CyclicBarrier
- Java并发之CyclicBarrier 可重用同步工具类
- Java并发同步工具类之CyclicBarrier
- Java并发工具类(二):同步屏障CyclicBarrier
- Java并发同步之CountDownLatch、CyclicBarrier和Semaphore
- 【死磕Java并发】—- J.U.C之并发工具类:CyclicBarrier
- Java多线程之同步工具类(CountDownLatch、CyclicBarrier、Semaphore)
- Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore
- 【死磕Java并发】—- J.U.C之并发工具类:CyclicBarrier
- 线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途
- Java5 多线程(五)--CyclicBarrier同步的工具类
- 【死磕Java并发】—- J.U.C之并发工具类:CyclicBarrier
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser、Exchanger)
- Java并发工具类之CyclicBarrier
- java多线程解说【拾陆】_并发工具类:CyclicBarrier
- Java5 多线程(五)--CyclicBarrier同步的工具类