Java并发包concurrent之CountDownLatch
来源:互联网 发布:黑马程序员骗了我 编辑:程序博客网 时间:2024/04/29 12:31
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。换句话说,你可以并行的执行一段代码,并设置等待所有的线程都执行完的点,然后再一起开始执行。举例说,五个个人一起(并行)包饺子,只有等所有的饺子都包好以后才一起下锅,就这个意思咯。
其API相对来说比较简单:
构造方法:
CountDownLatch(int count)
构造一个用给定计数初始化的 CountDownLatch 。
成员方法:
void await()
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
boolean await(long timeout, TimeUnit unit)
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
void countDown()
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
long getCount()
返回当前计数。
String toString()
返回标识此锁存器及其状态的字符串。
下面我们来举一个例子,演示一下CountDownLatch的使用。
假如有两个工人都要每人都要完成一项工作,工人1需要5秒,工人2需要3秒,那么两个人并行开始工作,在相同的资源下,计算2个任务都花费的总时间,我们就可以使用CountDownLatch来等待2个工人都完成来计算时间。我们来用代码模拟一下:
工人1:
package cn.slimsmart.java.demo.concurrent;import java.util.concurrent.CountDownLatch;public class Worker1 implements Runnable{private CountDownLatch latch;public Worker1(CountDownLatch latch){this.latch =latch;}@Overridepublic void run() {System.out.println("工人1开始工作");try {System.out.println("工作中...");Thread.currentThread().sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();System.out.println("工人1完成工作");}}工人2:
package cn.slimsmart.java.demo.concurrent;import java.util.concurrent.CountDownLatch;public class Worker2 implements Runnable{private CountDownLatch latch;public Worker2(CountDownLatch latch){this.latch =latch;}@Overridepublic void run() {System.out.println("工人2开始工作");try {System.out.println("工作中...");Thread.currentThread().sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}latch.countDown();System.out.println("工人2完成工作");}}计算花费时间:
package cn.slimsmart.java.demo.concurrent;import java.util.concurrent.CountDownLatch;public class CostTime {public static void main(String[] args) throws InterruptedException {CountDownLatch latch=new CountDownLatch(2);//两个线程并行long time = System.currentTimeMillis();new Thread(new Worker1(latch)).start();new Thread(new Worker2(latch)).start();latch.await();System.out.println("总共花费时间:"+(System.currentTimeMillis()-time)+"ms");}}运行结果:
工人1开始工作工作中...工人2开始工作工作中...工人2完成工作工人1完成工作总共花费时间:5011ms
1 0
- Java并发包concurrent之CountDownLatch
- Java并发包之CountDownLatch
- java-concurrent之CountDownLatch
- java-concurrent之CountDownLatch
- JAVA concurrent包学习--CountDownLatch
- Java多线程之concurrent包(六)——CountDownLatch
- java并发之concurrent包的结构
- Java 并发工具箱之concurrent包
- java.util.concurrent之CountDownLatch
- java并发包concurrent
- java 并发 concurrent 包
- 深入分析java.util.concurrent并发包下的CountDownLatch.java
- java.util.concurrent包(5)-CountDownLatch使用
- Java并发之CountDownLatch
- Java并发之CountDownLatch
- Java实例学习 Java并发编程之java.util.concurrent.CountDownLatch
- java 并发包 CountDownLatch 例子
- java并发包之倒计数闭锁CountDownLatch
- 体育竞技共含M个项目,求M值,且跳高中谁得了第二名?
- Java网络编程 - 浅析web服务器与浏览器的实现原理
- 2.3学习笔记 viewpager、简单的位运算
- poj2738 Two Ends
- 0001 嘿嘿
- Java并发包concurrent之CountDownLatch
- 趣科技:程序员那些事儿
- 如何对网站进行彻头彻尾分析
- GO 使用channel进行同步 (channel 1)
- Linux显示以log结尾的日志文件
- 2015年2月3号工作日志-------赵鑫
- javaweb开发篇——javaweb开发相关概念
- 巨人网络2015校招-产品专员笔试题
- 测试员,敢问路在何方?