CountDownLatch的简单使用

CountDownLatch的简单介绍:

CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行

CountDownLatch是一个倒计数的锁存器,当计数减至0时触发特定的事件。

CountDownLatch被用来同步一个或多个任务,强制它们等待由其他任务执行的一组操作完成。你可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用wait()方法都将阻塞,直至这个计数值达到0。其他任务在结束工作时,可以在该对象上调用凑你countDown()来减小这个计数值。CountDownLatch被设计为只触发一次,计数值不能被重置。如果你需要能够重置计数值的版本,则可以使用CyclicBarrier。

以下是jdk文档上的两个例子,我们可以学习一下。

一、开始信号,阻止任何工人进行,直到司机准备好他们继续进行

package com.linux.huhx.concurreny;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.TimeUnit;

public class Driver1 {

public static void main(String[] args) throws Exception {

CountDownLatch startSignal = new CountDownLatch(1);

CountDownLatch doneSignal = new CountDownLatch(5);

for (int i = 0; i < 5; ++i) // create and start threads

new Thread(new TaskWorker(startSignal, doneSignal)).start();

System.out.println("countDown before."); // don't let run yet

startSignal.countDown(); // let all threads proceed

TimeUnit.SECONDS.sleep(1);

System.out.println("await before");

/**

* 1、由于doneSignal里面的初始count=5,所以主线程在此会阻塞。

* 2、当所有的子线程执行完(doneSignal.countDown())之后,此时的count=0。所以后面代码可以继续执行。

*/

doneSignal.await();

System.out.println("await after");

}

private static class TaskWorker implements Runnable {

private final CountDownLatch startSignal;

private final CountDownLatch doneSignal;

public TaskWorker(CountDownLatch startSignal, CountDownLatch doneSignal) {

this.startSignal = startSignal;

this.doneSignal = doneSignal;

}

@Override

public void run() {

try {

/**

* 1、刚进来的时候,由于startSignal的count=1。所以await()方法阻塞于此。

* 2、当主线程执行了startSignal.countDown();此时的startSignal的count=0。所以子线程可以正常运行。

*/

startSignal.await();

doSomeWork();

doneSignal.countDown();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

private void doSomeWork() {

System.out.println("in run method: " + Thread.currentThread().getName());

}

}

}

执行的结果如下:子线程的执行顺序不固定

countDown before.

in run method: Thread-0

in run method: Thread-1

in run method: Thread-2

in run method: Thread-4

in run method: Thread-3

await before

await after

调用countDown()的任务在产生这个调用时并没有阻塞,只有对await()的调用会被阻塞,直至计数值到达0。

二、完成信号,允许司机等到所有工人完成为止

package com.linux.huhx.concurreny;

import java.util.Random;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Driver2 {

public static void main(String[] args) throws Exception {

CountDownLatch doneSignal = new CountDownLatch(5);

ExecutorService service = Executors.newFixedThreadPool(3);

for (int i = 0; i < 5; ++i) // create and start threads

service.execute(new WorkerRunnable(doneSignal, i));

System.out.println("await before");

doneSignal.await();

System.out.println("await after");

service.shutdown();

}

private static class WorkerRunnable implements Runnable {

private final CountDownLatch doneSignal;

private final int i;

public WorkerRunnable(CountDownLatch doneSignal, int i) {

this.doneSignal = doneSignal;

this.i = i;

}

@Override

public void run() {

doWork(i);

try {

Thread.sleep(new Random().nextInt(1000));

doneSignal.countDown();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

private void doWork(int i) {

System.out.println("in run method: " + i + " " + Thread.currentThread().getName());

}

}

}

运行的结果如下:子线程的执行顺序不固定

await before

in run method: 0 pool-1-thread-1

in run method: 2 pool-1-thread-3

in run method: 1 pool-1-thread-2

in run method: 3 pool-1-thread-1

in run method: 4 pool-1-thread-2

await after

java thread signal_java — Thread之CountDownLatch的使用相关推荐

  1. java 自带thread分析工具_java自带的jvm分析工具

    这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了.上网搜了搜,发现下面这些是比较常用的,然后我在机器上试试了,把结果也贴出来哈. ...

  2. 单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误

    第一种解决方案:单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误 解决办法: 创 ...

  3. Java并发编程—Thread类的start()方法是如何启动一个线程的?

    目录 一:Java线程介绍 二:Java线程入口分析 三:Java线程的创建 四:总结 周末抽了点时间,研究了下HotSpot是如何创建Java线程的,顺便总结一下.文中引用的源码里删除很多细节,只保 ...

  4. java thread start0_Java: Thread类中start()和run()的区别

    版本:JDK1.8 thread的两种使用方式: //继承Thread类 NewThread thread = newNewThread();//调用默认的构造方法,父类也会调用默认的 thread. ...

  5. Java学习之Thread之【Monitor】与【wait】与【notify】与【sleep】_加【Callable】【Executor】【ExecutorService】【Future】

    目录 ■基础 [相同点] [不同的] ■代码示例1(生产者与消费者) 0.ProductTest.java 1.Clerk.java 2.Consumer.java 3.Producer.java ■ ...

  6. Java中的Thread.sleep()– Java线程睡眠

    Java中的Thread.sleep (Thread.sleep in Java) Thread.sleep() method can be used to pause the execution o ...

  7. thread.java 619_java jstack thread 映射 linux 线程(LWP) | 学步园

    1.首先 jstack -l 18975 "http-342.877.573.944-8080-360" daemon prio=10 tid=0x0000002adaba9c00 ...

  8. java线程(Thread)的创建与常用方法

    目录 Process与Thread 线程的创建 继承Thread 2. 实现Runnable 3. 实现Callable 通过线程下载图片的例子 实现Runnable接口 抢票的例子: 龟兔赛跑: 实 ...

  9. JAVA线程之Thread类详解

    Thread类用于操作线程,是所以涉及到线程操作(如并发)的基础.本文将通过源码对Thread类的功能作用进行分析. 一.属性 /* Make sure registerNatives is the ...

最新文章

  1. 运用BeautifulSoup抓取网页的链接
  2. laravel批量插入报错:1292: Incorrect datetime value: '0000-00-00 00:00:00' for column 'TERM_DATE'
  3. 当心findFirst()和findAny()
  4. 总结面试时没有回答上的内存对齐问题
  5. AI算法连载09:统计之决策树
  6. react 组件构建_让我们用100行JavaScript构建一个React Chat Room组件
  7. 固定资产拆分比例怎么计算_固定资产加速折旧优惠扩围!怎么计算、申报?这篇说全了...
  8. php larve,封装composer包,实现thinkphp、larverl、yii框架中使用(使用框架实现回调方法)...
  9. APP分发渠道的竞争分析
  10. java keytool 导出证书,keytool 导出证书
  11. 从命名风格等方面解读阿里巴巴 Java 代码规范
  12. 这4款适合原型图的软件,产品经理都说好
  13. js实现当日期转农历日期
  14. 失落世界服务器国庆宝箱位置,失落的斯菲尔 图文攻略 全剧情任务流程全宝箱收集...
  15. 计算机应用基础图文混合排版,《Word 2010图文混合排版》教学设计与课后反思
  16. SqlServer2005中数据库角色成员身份
  17. Hey 朋友们好久不见。
  18. 2013 province java c-2 组素数
  19. SwitchHosts安装使用
  20. 国际中的steam教育发展与启示

热门文章

  1. java jms clust,Geoserver 的 JMS Cluster modules(集群数据同步)
  2. php控制器是啥,控制器的定义
  3. java扑克发牌程序_Java多线程实现扑克牌发牌程序实例
  4. 深入学习c++--智能指针(三) unique_ptr
  5. JS 数字左补零函数
  6. CCF2016.4 - A题
  7. 影响布局的inline-block的空白符的问题
  8. [数分提高]2014-2015-2第7教学周第2次课 (2015-04-16)
  9. JAVA js的escape函数、解析用js encodeURI编码的字符串、utf8转gb2312的函数
  10. 安卓手机的加密设备和加密外置SD卡