閉鎖相當於一扇門,在閉鎖到達結束狀態之前,這扇門一直是關閉著的,沒有任何線程可以通過,當到達結束狀態時,這扇門才會打開並容許所有線程通過。它可以使一個或多個線程等待一組事件發生。閉鎖狀態包含一個計數器,初始化為一個正式,正數表示需要等待的事件數量。 countDown方法遞減計數器,表示一個事件已經發生,而await方法等待計數器到達0,表示等待的事件已經發生。 CountDownLatch強調的是一個執行緒(或多個)需要等待另外的n個執行緒乾完某件事情之後才能繼續執行。
場景應用:
10個運動員準備賽跑,他們等待裁判一聲令下就開始同時跑,當最後一個人通過終點的時候,比賽結束。 10個運動相當於10個線程,這裡關鍵是控制10個線程同時跑起來,還有怎麼判斷最後一個線程到達終點。可以用2個閉鎖,第一個閉鎖用來控制10個線程等待裁判的命令,第二個閉鎖控制比賽結束。
import java.util.concurrent.CountDownLatch; class Aworker implements Runnable { private int num; private CountDownLatch begin; private CountDownLatch end; = begin; this.end = end; } @Override public void run() { // TODO Auto-generated method stub try { System.out.println(num + "th people is ready"); begin.await(); / /準備就緒} catch (InterruptedException e) { e.printStackTrace(); } finally { end.countDown(); //計數器減一,到達終點System.out.println(num + "th people arrive"); } }} public class Race { public static void main(String[] args) { int num = 10; CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, begin, end)).start(); } try { Thread.sleep((long) (Math.random() * 5000)); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("judge say : run !"); begin.countDown(); //裁判一聲令下開始跑long startTime = System.nanoTime(); try { end.await(); //等待結束} catch (InterruptedException e) { // TODO Auto -generated catch block e.printStackTrace(); } finally { long endTime = System.nanoTime(); System.out.println("judge say : all arrived !"); System.out.println("spend time: " + (endTime - startTime)); } }}
輸出
1th people is ready2th people is ready4th people is ready6th people is ready3 is ready4th people is ready6th people is ready3th people is ready10th people is ready8th people is ready5th people 1 arrive4th people arrive10th people arrive5th people arrive2th people arrivejudge say : all arrived !9th people arrive7th people arrive8th people arrive3th people arrive6arrive7th people arrive8th people arrive3th people arrive6arrive7th people arrive8th people arrive3th people arrive6一個 people ivearrive8th people arrive3th people arrive6th people ive arrive8