java.util.concurrent.CountDownLatch : 一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。--《JDK API 1.6.0》
換句話說,你可以並行的執行一段代碼,並設置等待所有的線程都執行完的點,然後再一起開始執行
舉例說,五個個人一起(並行)包餃子,只有等所有的餃子都包好以後才一起下鍋,得,就這個意思咯。
其API相對來說比較簡單:
構造方法摘要 | |
---|---|
CountDownLatch(int count) 構造一個用給定計數初始化的 CountDownLatch 。 |
方法摘要 | |
---|---|
void |
await() 使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷。 |
boolean |
await(long timeout, TimeUnit unit) 使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷或超出了指定的等待時間。 |
void |
countDown() 遞減鎖存器的計數,如果計數到達零,則釋放所有等待的線程。 |
long |
getCount() 返回當前計數。 |
String |
toString() 返回標識此鎖存器及其狀態的字符串。 |
從類 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
實例:
public class CountDownLatchDemo {
final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch=new CountDownLatch(2);//兩個線程並行
Worker worker1=new Worker("zhang san", 5000, latch);
Worker worker2=new Worker("li si", 8000, latch);
worker1.start();//
worker2.start();//
latch.await();//等待所有工人完成工作點
System.out.println("all work done at "+sdf.format(new Date()));
}
static class Worker extends Thread{
String workerName;
int workTime;
CountDownLatch latch;
public Worker(String workerName ,int workTime ,CountDownLatch latch){
this.workerName=workerName;
this.workTime=workTime;
this.latch=latch;
}
public void run(){
System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
doWork();//工作了
System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
latch.countDown();//工人完成工作,計數器減一
}
private void doWork(){
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
實例輸出:
Worker zhang san do work begin at 2015-01-03 21:26:38
Worker li si do work begin at 2015-01-03 21:26:38
Worker zhang san do work complete at 2015-01-03 21:26:43
Worker li si do work complete at 2015-01-03 21:26:46
all work done at 2015-01-03 21:26:46