CountDownLatch入門代碼解析

文章目錄

      • 核心思想:火箭發射倒計時 🚀
      • 最簡單易懂的代碼示例
      • 代碼解析
      • 運行流程分析

核心思想:火箭發射倒計時 🚀

想象一下發射火箭的場景,在按下最終的發射按鈕之前,必須有好幾個系統同時完成自檢,比如:

  1. 燃料系統檢查
  2. 引擎系統檢查
  3. 導航系統檢查

控制中心(主線程)必須等待這3個檢查全部報告“正常”后,才能下達“發射”指令。

CountDownLatch 就好比是這個場景中的倒計時計數器

  • CountDownLatch latch = new CountDownLatch(3);

    • 這等于在控制中心設置了一個初始值為 3 的倒計時器。意味著我們需要等待3個檢查任務完成。
  • latch.await(); (等待)

    • 控制中心(主線程)調用這個方法,然后就進入等待狀態。它會一直在這里被阻塞,直到倒計時器的數字變成 0
  • latch.countDown(); (倒數)

    • 每個檢查系統(工作線程)在完成自己的任務后,就調用一次這個方法。
    • 每調用一次,倒計時器的數字就減一
    • 當第三個檢查系統也調用了 countDown() 后,倒計時器數字變為0,await() 的等待結束,控制中心(主線程)被喚醒,繼續執行后續的發射指令。

最簡單易懂的代碼示例

下面我們就用代碼來模擬這個“火箭發射”的場景。

package CoountDownLatch;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SimpleCountDownLatchDemo {public static void main(String[] args) throws InterruptedException {// 1. 創建一個 CountDownLatch,計數器設置為 3//    意味著我們需要等待3個任務完成final CountDownLatch latch = new CountDownLatch(3);// 創建一個線程池來管理我們的檢查任務ExecutorService executor = Executors.newFixedThreadPool(3);System.out.println("主控室:準備發射火箭,等待各系統檢查...");// 2. 分配3個檢查任務給不同的線程for (int i = 1; i <= 3; i++) {final String checkerName = "檢查員-" + i;executor.submit(() -> {try {System.out.println("--> [" + checkerName + "] 開始進行系統檢查...");// 模擬檢查耗時Thread.sleep(new Random().nextInt(2000) + 1000); // 隨機耗時1-3秒System.out.println("... [" + checkerName + "] 檢查完成,已報告!");} catch (InterruptedException e) {e.printStackTrace();} finally {// 3. 關鍵!任務完成,調用 countDown(),計數器減一latch.countDown();}});}// 4. 主線程調用 await() 進入等待//    它會一直阻塞在這里,直到 latch 的計數器變為 0System.out.println("主控室:所有檢查任務已派出,等待報告...");latch.await();// --- 當所有檢查任務都調用了 countDown() 后,主線程才會從 await() 返回,執行以下代碼 ---System.out.println("主控室:所有系統檢查完成!準備發射!");System.out.println("3... 2... 1... 火箭發射!🚀");// 關閉線程池executor.shutdown();}
}

代碼解析

  1. new CountDownLatch(3): 設置了一個需要3個“報告”才能繼續的門閂。
  2. executor.submit(...): 我們派出了3個檢查員(線程)去并行工作。
  3. latch.countDown(): 這是每個檢查員完成工作后必須要做的事——向控制中心報告“我搞定了”。每報告一次,倒計時就減一。
  4. latch.await(): 這是主線程(控制中心)的等待點。它會一直卡在這里,直到收到全部3個“搞定了”的報告。

運行流程分析

  1. 程序啟動,main 線程打印 “準備發射火箭…”。
  2. 3個檢查員線程被創建并開始并行地執行檢查(你會看到3條 “開始進行系統檢查…” 的日志)。
  3. main 線程打印 “所有檢查任務已派出…” 后,立刻調用 latch.await()進入阻塞等待
  4. 在接下來的幾秒內,你會看到檢查員們隨機地、不按順序地完成他們的工作,并打印 “檢查完成,已報告!”。每完成一個,latch 的計數就減一。
  5. 第三個檢查員也完成并調用 countDown() 后,latch 的計數變為0。
  6. main 線程的 await() 立刻被喚醒,程序繼續執行,打印出最終的 “火箭發射!🚀”。

這個模式非常適合一個主線程需要等待多個子任務全部執行完畢后再進行匯總或執行下一步的場景。

流程:

  1. 定義Latch數量
  2. 在多線程任務中每次完成就latch.countDown();
  3. 在主線程中調用latch.await();進入等待,它會一直阻塞在這里,直到 latch 的計數器變為 0
  4. 當所有檢查任務都調用了 countDown() 后,主線程才會從 await() 返回

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909473.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909473.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909473.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用Python寫一個可視化大屏

用Python打造可視化大屏&#xff1a;數據洞察新視界 在當今數據爆炸的時代&#xff0c;數據可視化成為了理解和傳達復雜信息的關鍵工具。Python作為一門強大且靈活的編程語言&#xff0c;提供了豐富的庫和工具&#xff0c;讓我們能夠創建出令人驚嘆的可視化大屏。本文將帶你逐步…

20250611讓NanoPi NEO core開發板在Ubuntu core16.04系統下開機自啟動的時候拉高GPIOG8

rootNanoPi-NEO-Core:/# touch open_4g_ec20.sh rootNanoPi-NEO-Core:/# vi open_4g_ec20.sh 【打開使能引腳200 IOG8】 echo 200 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio200/direction echo 1 > /sys/class/gpio/gpio200/value 【切記&#xff1a…

解惑1、為何大容量電容濾低頻,小容量電容濾高頻

一、電容的種類&#xff1a; 鏈接&#xff1a; 二、疑惑 理論推算&#xff1a; 1&#xff09;Zc1/wc&#xff0c;那么大容量和小容量的電容&#xff0c;不應該都是 越高頻越阻抗低&#xff0c;越容易通過&#xff1f; 2&#xff09;大容量&#xff0c;積蓄電荷速度慢&#…

如何有效監控JVM環境,保障應用性能

緩慢的Java應用程序、意外崩潰和晦澀的內存問題——這些都是JVM可能在默默承受壓力的信號。JVM監控對于保障Java應用的正常運行時間和最佳性能至關重要&#xff0c;它提供了對Java虛擬機內存、線程和CPU資源使用情況的可見性&#xff0c;使管理員能夠在影響終端用戶之前識別性能…

python:PyQt5 開發一個郵件客戶端,能編寫郵件,發送郵件及附件

PyQt5 郵件客戶端 下面是一個簡潔高效的郵件客戶端實現&#xff0c;支持編寫郵件、添加附件和發送郵件功能&#xff1a; 編寫 eMailClient_qt.py 如下 # -*- coding: utf-8 -*- """ 用 PyQt5 開發一個郵件客戶端&#xff0c;能編寫郵件&#xff0c;發送郵件及…

React【回顧】 深層次面試詳解:函數式組件核心原理與高級優化

以下是對 React 深層次內容的全面解析,涵蓋函數式組件的核心原理、性能優化、設計模式和最新特性: ?? 一、React 核心機制剖析 1. Fiber 架構深解 Fiber 節點結構:function FiberNode(tag, pendingProps, key) {this.tag = tag; // 組件類型(函數組件=0, 類…

視覺語言模型的“視而不見“

這項研究發現&#xff0c;號稱能“看圖說話”的視覺語言模型&#xff08;VLMs&#xff09;&#xff0c;在處理需要真正“看”懂圖片的純視覺任務&#xff08;如判斷深度、找對應點、認物體材質等&#xff09;時&#xff0c;表現遠不如它們自己內部的“眼睛”&#xff08;視覺編…

Wyn 商業智能與 3D 大屏的深度融合應用

引言 在當今數字化快速發展的時代&#xff0c;數據可視化對于企業的決策和管理變得至關重要。商業智能軟件作為數據可視化的重要工具&#xff0c;能夠幫助企業將海量的數據轉化為直觀、易懂的信息。而 3D 大屏以其沉浸式、立體的展示效果&#xff0c;為數據可視化帶來了全新的…

使用docker compose部署netmaker打通內網

準備 我看官網推薦都是使用ssl然后要ssl證書&#xff0c;不想走彎路了 一、docker-compose.yml version: "3.4"services:netmaker:container_name: netmakerimage: gravitl/netmaker:v0.90.0restart: unless-stoppedports:- "18081:18082"- "50051…

Linux集市采購指南[特殊字符]:yum和apt的“搶貨”大戰!

Linux集市采購指南&#x1f345;&#xff1a;yum和apt的“搶貨”大戰&#xff01; ? 歡迎來到 Linux軟件生態集市&#xff01;這里分兩大陣營&#xff1a; &#x1f96c; CentOS/RHEL傳統菜市場&#xff1a;派穩重的 yum 大叔當采購員&#xff0c;做事一板一眼&#xff1b;?…

DataX 框架學習筆記

官方倉庫&#xff1a; https://github.com/alibaba/DataX?tabreadme-ov-file 1. 介紹 1.1. 基本介紹&#xff1a; DadaX 是阿里云 DataWorks 數據集成 的開源版本&#xff08;異構數據同步、離線數據同步工具 / 平臺&#xff09;。主要抽象為 Reader 和 Writer 插件&#…

MaxCompute的Logview分析詳解

文章目錄 一、Logview簡介1、概述2、標題與功能3、基礎信息 二、作業詳情1、Job Details2、Fuxi Sensor3、Result①當前作業運行成功&#xff0c;顯示的為運行結果。②當前作業運行失敗&#xff0c;顯示的為失敗原因。 4、SourceXML5、SQL Script6、History7、SubStatusHistory…

HTML5白云飄飄動態效果教程

HTML5白云飄飄動態效果教程 這里寫目錄標題 HTML5白云飄飄動態效果教程效果介紹實現步驟步驟一&#xff1a;創建HTML結構步驟二&#xff1a;設計CSS樣式步驟三&#xff1a;添加JavaScript交互 代碼解析HTML結構解析CSS樣式解析JavaScript功能解析 自定義調整總結 效果介紹 本教…

tcp高難度問題

以下是針對這些問題&#xff0c;在面試場景下&#xff0c;既保證理論扎實、邏輯清晰&#xff0c;又具備交流延展性的回答思路與內容&#xff0c;可根據實際面試節奏和面試官反饋靈活調整展開&#xff1a; 1. 客戶端端口號如何確定的&#xff1f; 面試官您好&#xff0c;客戶端…

廣東省省考備考(第二十八天6.13)—資料分析(第二節課)

基期與現期 官方定義&#xff1a;作為對比參照的是基期&#xff0c;而相對于基期比較的是現期 通俗說法&#xff1a;時間靠前的為基期&#xff0c;時間靠后的為現期 增長量與增長率 增長量用來表述基期量與現期量變化的絕對量&#xff1b; 增長率用來表述基期量與現期量變化…

pytorch 中前向傳播和后向傳播的自定義函數

系列文章目錄 文章目錄 系列文章目錄一、torch.autograd.function代碼實例 在開始正文之前&#xff0c;請各位姥爺動動手指&#xff0c;給小店增加一點訪問量吧&#xff0c;點擊小店&#xff0c;同時希望我的文章對你的學習有所幫助。本文也很簡單&#xff0c;主要講解pytorch的…

【項目實訓#08】HarmonyOS知識圖譜前端可視化實現

【項目實訓#08】HarmonyOS知識圖譜前端可視化實現 文章目錄 【項目實訓#08】HarmonyOS知識圖譜前端可視化實現一、背景簡介二、技術方案與架構設計2.1 技術選型2.2 組件架構設計 三、知識圖譜可視化組件實現3.1 KGResultTab組件設計組件模板結構不同狀態的處理用戶交互控制節點…

【軟件開發】什么是DSL

什么是DSL DSL&#xff08;Domain-Specific Language&#xff0c;領域特定語言&#xff09;是一種為特定領域或任務設計的編程語言&#xff0c;目的在于提高該領域中的表達能力與開發效率。 1 在腳本語言中的 DSL 是什么&#xff1f; 在腳本語言&#xff08;如 Python、Lua、…

JasperReport生成PDF/A類型文檔

當JasperReport導出的文檔為PDF/A模式時&#xff0c;該PDF為只讀可以防止被修改。 設置導出參數 JRPdfExporter exporter new JRPdfExporter();exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrints));exporter.setExporterOutput(new SimpleOutputStre…

微信小程序使用畫布實現飄落泡泡功能

微信小程序使用畫布實現飄落泡泡功能&#xff1a;從組件封裝到頁面調用的完整實踐 先看示例截圖&#xff1a; 一、背景與技術選型 在微信小程序中實現類似于飄落的泡泡或者櫻花飄落的功能&#xff0c;一般主要有 Canvas 和圖片兩種方案&#xff1a; &#xff08;1&#xff…