閉鎖相當于一扇門,在閉鎖到達結束狀態(tài)之前,這扇門一直是關閉著的,沒有任何線程可以通過,當?shù)竭_結束狀態(tài)時,這扇門才會打開并容許所有線程通過。它可以使一個或多個線程等待一組事件發(fā)生。閉鎖狀態(tài)包括一個計數(shù)器,初始化為一個正式,正數(shù)表示需要等待的事件數(shù)量。countDown方法遞減計數(shù)器,表示一個事件已經(jīng)發(fā)生,而await方法等待計數(shù)器到達0,表示等待的事件已經(jīng)發(fā)生。CountDownLatch強調(diào)的是一個線程(或多個)需要等待另外的n個線程干完某件事情之后才能繼續(xù)執(zhí)行。
場景應用:
10個運動員準備賽跑,他們等待裁判一聲令下就開始同時跑,當最后一個人通過終點的時候,比賽結束。10個運動相當于10個線程,這里關鍵是控制10個線程同時跑起來,還有怎么判斷最后一個線程到達終點。可以用2個閉鎖,第一個閉鎖用來控制10個線程等待裁判的命令,第二個閉鎖控制比賽結束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.util.concurrent.CountDownLatch; class Aworker implements Runnable { private int num; private CountDownLatch begin; private CountDownLatch end; public Aworker( int num, final CountDownLatch begin, final CountDownLatch end) { this .num = num; this .begin = 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(); //計數(shù)器減一,到達終點 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)); } } } |
輸出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
1th people is ready 2th people is ready 4th people is ready 6th people is ready 3th people is ready 10th people is ready 8th people is ready 5th people is ready 7th people is ready 9th people is ready judge say : run ! 1th people arrive 4th people arrive 10th people arrive 5th people arrive 2th people arrive judge say : all arrived ! 9th people arrive 7th people arrive 8th people arrive 3th people arrive 6th people arrive spend time: 970933 |