转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html 

一:CountDownLatch

CountDownLatch是一个执行 完成任务线程数 的 倒数计数器。我们考虑这种情况:士兵晨练,必须全队士兵集合完毕才开始跑步。用程序描述就:在晨练线程中,逐个启动士兵的集合线程,执行集合动作;等所有士兵的集合线程都执行完毕,才能继续晨练线程执行跑步操作。那么我们怎么快速地统计已经集合的士兵线程数,以及怎样在集合完毕后第一时间启动跑步呢?这里就需要用到CountDownLatch。

1:首先,我们在晨练线程中创建一个CountDownLatch:static final CountDownLatch countDownLatch = new CountDownLatch(10);//构造参数说明有多少个需要完成的线程

2:在每个士兵的集合线程中,通过:countDownLatch.countDown();  //说明当前线程已经执行到屏障处,把倒数计数器值减1

3:在晨练线程中,通过:countDownLatch.await();  //暂时挂起线程,等待倒数计数器为0时自动唤醒,继续执行

二:CyclicBarrier

与countDownLatch相反,这是一个加法计数器的同步屏障,并且可以重复使用。它在每个线程中设置屏障点,当一个线程执行到屏障点时就需要停下,计数器+1,直到计数器达到创建时指定值时执行相应的响应线程,并且全部线程继续执行,直到下一个屏障处等待或者执行完毕。

1:创建CyclicBarrier同步屏障对象,设置屏障处计数值以及达到该值后执行什么响应动作线程:

CyclicBarrier barrier = new CyclicBarrier(n, new BarrierDone_Run());

2:在BarrierDone_Run线程中,定义  执行到屏障处而停顿的线程数达到设定值  时,启动响应线程执行后续操作。

3:逐个启动工作线程,在工作线程的run()方法中,通过: barrier.await();  //设定屏障,当线程执行到这步时挂起,直到计数器达到设定值时才继续执行

三:比较

1:CountDownLatch是把主干线程挂起,在任务线程中进行倒数计数,直到任务线程执行完才唤醒主干线程继续执行;

CyclicBarrier是把任务线程挂起,直到所有任务线程执行到屏障处再放行继续执行;

2:CountDownLatch达到屏障放行标准后放行的是主干线程;

CyclicBarrier达到屏障放行标准后放行的是任务线程,并且还会额外地触发一个达到标准后执行的响应线程;

Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用的更多相关文章

  1. 多线程之CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  2. Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒

    java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...

  3. Java多线程之CountDownLatch学习

    给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...

  4. JAVA多线程之CountDownLatch

    前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...

  5. JAVA多线程之CountDownLatch与join的区别

    首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...

  6. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  7. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  8. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  9. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

随机推荐

  1. 维京传奇第四季/全集Vikings迅雷下载

    英文全名Vikings,第4季(2015). 本季看点:<维京传奇>当第四季开始时,Ragnar已经病入膏肓,随时可能丧命.毫无疑问,权力斗争异常激烈,谁都想在Ragnar死后获得最大利益 ...

  2. 迷宫问题的C语言求解

    1 .Preface /** * There have been many data to introduce the algorithm. So I will try to simply expla ...

  3. CUDA报错: Cannot create Cublas handle. Cublas won't be available. 以及:Check failed: status == CUBLAS_STATUS_SUCCESS (1 vs. 0) CUBLAS_STATUS_NOT_INITIALIZED

    Error描述: aita@aita-Alienware-Area-51-R5:~/AITA2/daisida/ssd-github/caffe$ make runtest -j8 .build_re ...

  4. 用Eclipse开发Androd应用程序时,自带虚机模拟器太慢了,怎么办

    问:用Eclipse开发Androd应用程序时,系统自带模拟器太慢了,怎么办? 答:用Genymotin

  5. poj 1325 Machine Schedule 题解

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14479   Accepted: 6172 ...

  6. DBS-Tally book(记账本)

    ylbtech-dbs:DBS-Tally book(记账本) -- =============================================-- 记账本-- 模仿小程序“记账e”业 ...

  7. CodeFirst体验之且行且珍惜

    CodeFirst作为一种新的开发理念和方式,EF  Code-First相对于MVC中的DataFirst,ModelFirst确实开发效率确实高点,至少数据库建表这一块,直接用类映射到数据中,标记 ...

  8. 大数据开发实战:Stream SQL实时开发二

    1.介绍 本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为 ...

  9. 【R】函数-数学函数

  10. SQL-order by两个字段同时排序

    ORDER BY 后可加2个字段,用英文逗号隔开. --f1用升序, f2降序,sql该这样写 ORDER BY f1, f2 DESC --也可以这样写,更清楚: ORDER BY f1 ASC, ...