CountDownLatch
內部維護了一個計數器,只有當計數器==0時,某些線程纔會停止阻塞,開始執行。
就好比火箭發射,只有當讀秒從10->1之後才執行發射動作一樣。
構造方法摘要 |
---|
CountDownLatch(int count) 構造一個用給定計數初始化的 CountDownLatch 。 |
常用方法 |
---|
await() 使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷。 |
await(long timeout, TimeUnit unit) 使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷或超出了指定的等待時間。 |
countDown() 遞減鎖存器的計數,如果計數到達零,則釋放所有等待的線程。 |
CountDownLatch
主要有兩個方法,countDown()
來讓計數器-1,await()
來讓線程阻塞。當count==0
時,阻塞線程自動喚醒。
舉例演示:
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch=new CountDownLatch(10);
for (int i = 10; i > 0; i--) {
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"準備發射事宜~");
Thread.sleep(2*1000);
System.out.println(Thread.currentThread().getName()+"準備完畢~");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
},String.valueOf("線程")+(11-i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName()+"發射~");
}
}
結果:
線程1準備發射事宜~
線程3準備發射事宜~
線程2準備發射事宜~
線程4準備發射事宜~
線程5準備發射事宜~
線程6準備發射事宜~
線程7準備發射事宜~
線程8準備發射事宜~
線程9準備發射事宜~
線程10準備發射事宜~
線程1準備完畢~
線程2準備完畢~
線程4準備完畢~
線程5準備完畢~
線程3準備完畢~
線程9準備完畢~
線程8準備完畢~
線程10準備完畢~
線程7準備完畢~
線程6準備完畢~
main發射~