給出官網上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.htmlhtml
Java中concurrent包中的CountDownLatch類說白了就是一個計數器,咱們能夠經過設置參數來進行計數,每次只能有一個線程去操做這個計數器,經過CountDown這個函數使得計數器的值減少,當計數器的值爲0時,阻塞於await方法的線程才能得以執行。java
例子:下面的程序中的主線程阻塞於await方法, 只有當5個線程都執行完了,主線程才能繼續執行。api
package com.test; import java.util.Random; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { private static final int N = 5; private CountDownLatch waitCountDownLatch = null; public static void main(String[] args) throws InterruptedException { new CountDownLatchDemo(); } public CountDownLatchDemo() throws InterruptedException { waitCountDownLatch = new CountDownLatch(N); for (int i = 0; i < N; ++i) { new MyThread(i).start(); } waitCountDownLatch.await(); System.out.println("全部線程已經執行完成"); } class MyThread extends Thread { private int id; MyThread(int id) { this.id = id; } public void run() { try { System.out.println("線程 " + id + "正在執行" ); Thread.sleep(new Random().nextInt(2) * 1000); } catch (InterruptedException ex) { ex.printStackTrace(); } finally { waitCountDownLatch.countDown(); } } } }
注:CountDownLatch類中有如下幾個方法oracle
void await()等待,直到計數器中的值減爲0。
boolean await(long timeout, TimeUnit unit)能夠本身設置超時時間,一旦超過這個時間,await線程被喚醒,若是返回true,說明計數器爲0,不然,不爲0。
void countDown()使得計數器的值減1。
long getCount()獲得當前計數器的值。