Java并发包concurrent之CountDownLatch
2015-02-03 21:55
330 查看
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:
其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; } @Override public 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; } @Override public 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
相关文章推荐
- 深入分析java.util.concurrent并发包下的CountDownLatch.java
- Java多线程与并发库高级应用之倒计时计数器CountDownLatch
- java并发包里的CountDownLatch的用法
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- java并发(一) CountDownLatch (在多个线程都结束后再去执行某个任务)
- java并发学习之CountDownLatch
- Java_并发线程_Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- java CountDownLatch 模拟多并发线程简单例子
- Java并发之CountDownLatch、CyclicBarrier、Semaphore
- java 1.5 并发流程控制CountDownLatch,CyclicBarrier,Semaphore
- java并发之CountDownLatch
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger
- java并发之CountDownLatch、Semaphore和CyclicBarrier
- Java并发编程之——同步器工具类(semaphores, barriers, CountDownLatch,exchangers)
- Java多线程——6 并发流程控制CountDownLatch、CycliBarrier
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java并发学习笔记(14) 闭锁(CountDownLatch)
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
- Java线程(十一):CountDownLatch-线程并发的发令枪
- 同步工具类 java.util.concurrent.CountDownLatch