转载请注明原文地址: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. Android之多种Bitmap效果

    1. 将图片变为圆角 2. 获取缩略图图片 3. LOMO特效 4. 旧时光特效 5. 暖意特效 6. 根据饱和度.色相.亮度调整图片 7. 添加图片外边框 8. 添加内边框 9. 创建一个缩放的图片 ...

  2. Fragment中生命周期函数的介绍

    1)第一次启动:onCreate->onAttach->onCreate->onCreateView->onActivityCreated->onStart->on ...

  3. Android Studio 下载地址

    下载地址:https://developer.android.com/sdk/index.html#download      这个网址可以下载需要的东西,FQ的话可以给 xifulinmen@gma ...

  4. .Net Core中文编码问题整理

    1..Net Core Console控制台程序 在.Net Core中默认System.Text中不支持CodePagesEncodingProvider.Instance, System.Text ...

  5. 不越狱安装破解软件,iResign重签名方法

    http://www.baidu.com/s?wd=iresign%E8%BD%AF%E4%BB%B6&rsv_spt=1&issp=1&rsv_bp=0&ie=utf ...

  6. 【UOJ Round #1】

    枚举/DP+排列组合 缩进优化 QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$ 然而 ...

  7. Class:Task 类

    ylbtech-.Net-Class:Task 类 1. Task 类返回顶部 1-1. #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, ...

  8. scrapy框架系列 (5) Spider类

    Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及 ...

  9. Add Binary Leetcode java

    题目: Given two binary strings, return their sum (also a binary string). For example, a = "11&quo ...

  10. ie7 z-index 失效问题

    解决办法: 父级元素加上position:relative;并设置z-index. 父级元素的z-index优先,其中包含的元素的z-index是相对于父级元素的index. <div styl ...