你的位置:首页 > Java教程

[Java教程]Java并发之CountDownLatch


CountDownLatch是Java concurrent包下的一个同步工具。它可以让一个(或多个)线程等待,直到其他线程中的某些操作完成。

本质上是一个信号量,我们把它比作一个有N个插销的大门,它把等待(调用await)的线程挡住了, 直到其他线程把插销去完了(调用countDown减到0),这批线程才能执行。

下面是根据oracle官方文档改的一个例子:

/** * * Sample usage: Here is a pair of classes in which a group of worker threads use two countdown latches: The first is a start signal that prevents any worker from proceeding until the driver is ready for them to proceed; The second is a completion signal that allows the driver to wait until all workers have completed. */public class CountDownLatchDemo {  public static void main(String[] args) throws InterruptedException {    new Driver().run();  }}class Driver {  static final int N = 5;  public void run() throws InterruptedException {    CountDownLatch startSignal = new CountDownLatch(1);    CountDownLatch doneSignal = new CountDownLatch(N);    for (int i=0; i<N; i++) {      new Thread(new Worker(startSignal, doneSignal))          .start();    }    doSomething(); // don't let run yet    startSignal.countDown(); // let all threads proceed    doneSignal.await(); // wait for all to finish    doSomething();  }  private void doSomething() {    System.out.println("doSomething");  }}class Worker implements Runnable {  private CountDownLatch startSignal;  private CountDownLatch doneSignal;  public Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {    this.startSignal = startSignal;    this.doneSignal = doneSignal;  }  public void run() {    try {      startSignal.await();      doWork();      doneSignal.countDown();    } catch (InterruptedException e) {      e.printStackTrace();    }  }  private void doWork() {    System.out.println("worker work.");  }}

把Driver看作是一个监工,Worker看作是工人,有5个。

  • 监工发号施令后,工人们才可以干活。所以工人干活前调用startSignal.await(), 直到监工调用startSignal.countDown() 后Worker后续doWork才开始执行。 
  • 工人们干完活后通知监工,监工才可以接着发号。所以监工调用doneSignal.await()在哪儿等着,直到工人们都干完活(调用5次doneSignal.countDown())后,才能接着执行。

看下执行结果,有助于理解整个工作过程和latch机制:

doSomething
worker work.
worker work.
worker work.
worker work.
worker work.
doSomething




跟团希腊旅游需要多少钱几月份去希腊旅游最好什么时候去希腊旅游最便宜去希腊旅游跟团要多少钱去希腊旅游需要多少钱德清到月牙泉温泉有直达车吗?德清到月潭温泉度假村乘车路线? 跑马岭野生动物园五一有什么好玩的?济南跑马岭怎么样? 株洲火车站到方特欢乐世界怎么走?株洲火车站到方特多少公里? 2015五一德清月潭温泉门票价格?德清月牙泉温泉度假村五一泡温泉多少钱? 福建永泰云顶山好玩吗?有什么特色看点啊? 温州到福建九鲤溪该怎么走?多远? 福建永泰云顶山门票多少?学生有没有优惠价? 福建尤俊农耕文化园门票价格多少?园区内有什么呢? 第一次去香港有什么必到景点? 春节可以从广州坐火车过去香港吗? 春节去香港旅游有什么美食推荐? 2015年香港除夕倒数烟火在哪里举行? 国庆节去香港旅游有什么好的路线推荐? 深圳可以直接去澳门吗? 香港什么时候打折最厉害? 香港最佳旅游时间是什么时候? LTC-5623G-NB Datasheet LTC-5623G-NB Datasheet LTC-5623G-R1 Datasheet LTC-5623G-R1 Datasheet LTC-5623HR Datasheet LTC-5623HR Datasheet 深圳去毛里求斯旅游价格 深圳去毛里求斯旅游价格 深圳去毛里求斯旅游价格 毛里求斯旅游跟团 毛里求斯旅游跟团 毛里求斯旅游跟团 毛里求斯报价 毛里求斯报价 毛里求斯报价