CountDownLatch快速理解:線程需要等待其他線程做完一些事之後,才能夠繼續執行
圖解:線程a和b執行了await()方法,只有等到Thread1、thread2、thread3執行,知道countdown()讓cnt變爲0之後,線程a和b纔開始執行
(第一次用word畫這種圖,好醜)
原理:後面學習了AQS會進行補充
示例代碼
public class MyCountDownLatch {
static CountDownLatch latch = new CountDownLatch(4);
public static void main(String[] args) throws InterruptedException {
System.out.println("主線程開始執行");
for (int i = 0; i < 4; i++) {
new Thread() {
@Override
public void run() {
try {
//確保latch.await();先執行
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + ":countdown執行一次");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + ":開始執行,我要等待countdown");
latch.await();
System.out.println("await完畢,開始執行本線程");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
latch.await();
System.out.println("主線程執行完畢");
}
}
執行結果:
主線程開始執行
Thread-4:開始執行,我要等待countdown
Thread-2:countdown執行一次
Thread-3:countdown執行一次
Thread-0:countdown執行一次
Thread-1:countdown執行一次
主線程執行完畢
await完畢,開始執行本線程