Java CountDownLatch線程同步源碼硬核解析

場景

有時間在主線程中開啟瞭多線程後,主線程需要等所有線程執行完畢才能return,這個時候就需要在return前攔一下,直到所有線程執行完畢。

或者,某些場景下需要多個線程同一時間執行,需要在起步的時候統一攔一下,然後收到通知再運行。

java.util.concurrent.CountDownLatch就能實現我們上面的這些需求。

CountDownLatch

CountDownLatch是通過一個計數器來實現的,計數器的初始化值為線程的數量。每當一個線程完成瞭自己的任務後,計數器的值就相應得減1。當計數器到達0時,表示所有的線程都已完成任務,然後在閉鎖上等待的線程就可以恢復執行任務

代碼demo

直接上demo把。

主線程等待多線程完成後返回

CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
    new Thread(() -> {
        String name = Thread.currentThread().getName();
        System.out.println(name + "等待5秒" + LocalDateTime.now());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(name + "扣減1" + LocalDateTime.now());
        countDownLatch.countDown();
    }).start();
}
try {
    countDownLatch.await();
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}
System.out.println("finish");

執行結果

讓所有線程同一時間執行

CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 5; i++) {
       new Thread(() -> {
           String name = Thread.currentThread().getName();
           try {
               System.out.println(name + "準備" + LocalDateTime.now());
               countDownLatch.await();
               System.out.println(name + "完成" + LocalDateTime.now());
           } catch (InterruptedException e) {
               throw new RuntimeException(e);
           }
       }).start();
}
try {
    Thread.sleep(5000);
    System.out.println("link start");
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}
countDownLatch.countDown();

執行結果

到此這篇關於Java CountDownLatch線程同步源碼硬核解析的文章就介紹到這瞭,更多相關Java CountDownLatch內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: