博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 提升之CountDownLatch
阅读量:6810 次
发布时间:2019-06-26

本文共 2525 字,大约阅读时间需要 8 分钟。

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

主要方法

 public CountDownLatch(int count);

 public void countDown();

 public void await() throws 

 

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

package com.study.thread.concurrent;import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author draem0507 * @TODO 学下countdownLatch * @version 0.1 * @create 2012 15:03:28 *  */public class CountDownLatchTest {    /**     * 

* CountDownLatch类是一个同步计数器,构造时传入int参数, *

*

* 该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1, *

*

* 计数器大于0 时,await()方法会阻塞程序继续执行 *

*/ public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(3); Worker worker1 = new Worker("小明", countDownLatch); Worker worker2 = new Worker("小红", countDownLatch); Worker worker3 = new Worker("小强", countDownLatch); Boss boss = new Boss(countDownLatch); ExecutorService service = Executors.newCachedThreadPool(); service.execute(worker1); service.execute(worker2); service.execute(worker3); service.execute(boss); service.shutdown(); }}class Worker implements Runnable { private String name; private CountDownLatch countDownLatch; public void run() { doWork(); try { Thread.sleep((new Random().nextInt(10)) * 1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(name + "-->结束干活"); countDownLatch.countDown(); } public Worker(String name, CountDownLatch countDownLatch) { this.name = name; this.countDownLatch = countDownLatch; } private void doWork() { System.out.println(name + "-->正在干活"); }}class Boss implements Runnable { private CountDownLatch countDownLatch; public Boss(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } public void run() { System.out.println("老板正在等待验工"); try { countDownLatch.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("工人干活都结束,老板开始验工"); }}

结果:

小明-->正在干活小红-->正在干活老板正在等待验工小强-->正在干活小强-->结束干活小明-->结束干活小红-->结束干活工人干活都结束,老板开始验工

不一定都按上述结果呈现,但是最后一句话肯定是最后执行

参考:

  

  http://www.iteye.com/topic/1002652

转载地址:http://jvtwl.baihongyu.com/

你可能感兴趣的文章
enlightenment提权的工具
查看>>
指针的意义和linux的内存回收艺术
查看>>
刚才调试了个mysql中文乱码的问题
查看>>
操作系统就是虚拟机--主内又主外
查看>>
Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码...
查看>>
Zookeeper 集群的安装与部署
查看>>
MySQL 5.6版本二进制包多实例安装
查看>>
Centos网络管理(五)-Bonding、网络组和网桥
查看>>
PyCharm----中文显示乱码的解决方法总结
查看>>
crontab使用环境变量
查看>>
“独立博客”为什么独立?
查看>>
Uber花了21亿元入驻上海自贸区 不叫优步叫雾博
查看>>
iptables应用
查看>>
软件包管理
查看>>
Java内存模型
查看>>
AppLinks使用详解
查看>>
JavaScript正则表达式19例(11)
查看>>
UNIX发展历史流程图
查看>>
负载均衡之LVS详解
查看>>
WP7实例篇之土豆搜索器(2)
查看>>