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!
推薦閱讀:
- Java多線程同步工具類CountDownLatch詳解
- 一文詳解Java閉鎖和柵欄的實現
- Java中常見的並發控制手段淺析
- Java並發編程之常用的輔助類詳解
- java並發包中CountDownLatch和線程池的使用詳解