CountDownLatch應用舉例

定義

CountDownLatch是juc下的一個多線程鎖,下面是jdk對它的定義

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

翻譯如下

一種同步輔助工具,允許一個或多個線程等待,直到在其他線程中執行的一組操作完成。

可以簡單地理解為倒計次數鎖,只有計數為零時,才能執行之后的代碼

關鍵api

  1. 構造方法
public CountDownLatch(int count)
  1. 倒計數。每執行一次這個方法,計數就減少一次
public void countDown()
  1. 等待。阻塞方法,如果倒計次數沒有清空,則會一直阻塞,后面的代碼則無法執行
public void await() throws InterruptedException
public boolean await(long timeout, TimeUnit unit)throws InterruptedException
  1. 獲取當前計數
public long getCount()

應用場景

有一個物業經理,派出手下11個員工去收取物業費,每個員工收費結束交給經理,經理計算手中的總額,大于等于100元,則把交給上級。最后的員工到達后,不論多少,經理都將手中的錢交給上級

EMPLOYEE_COUNT :員工數量
totalAmount :經理手中的金額
THRESHOLD_AMOUNT:門檻金額,當到達門檻金額時,要執行上交操作,totalAmount 清零
feeQueue :使用BlockingQueue阻塞隊列用于存放收取的物業費

代碼如下

private static final int EMPLOYEE_COUNT = 11;
private static final int THRESHOLD_AMOUNT = 100;
private static BlockingQueue<Integer> feeQueue = new ArrayBlockingQueue<>(EMPLOYEE_COUNT);
private static int totalAmount = 0;public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(EMPLOYEE_COUNT + 1);CountDownLatch countDownLatch = new CountDownLatch(EMPLOYEE_COUNT);// 啟動經理線程executorService.execute(() -> {try {while (countDownLatch.getCount() > 0 || !feeQueue.isEmpty()) {Integer amount = feeQueue.poll();if (amount != null) {totalAmount += amount;System.out.println("經理收到了 " + amount + " 元,總金額:" + totalAmount);if (totalAmount >= THRESHOLD_AMOUNT) {System.out.println("經理將 " + totalAmount + " 元交給上級");totalAmount = 0;}}}} catch (Exception e) {Thread.currentThread().interrupt();}});// 啟動員工線程for (int i = 1; i <= EMPLOYEE_COUNT; i++) {final int employeeId = i;executorService.execute(() -> {int amount = (int) (Math.random() * 100) + 1; // 模擬收取隨機金額System.out.println("員工 " + employeeId + " 收取了 " + amount + " 元");try {feeQueue.put(amount);} catch (InterruptedException e) {Thread.currentThread().interrupt();}countDownLatch.countDown();});}// 關閉線程池executorService.shutdown();try {countDownLatch.await(); // 等待所有員工線程完成} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 最后處理剩余金額if (totalAmount > 0) {System.out.println("最后的員工到達后,經理將剩余的 " + totalAmount + " 元交給上級");}
}

輸出結果如下
可以看到經理每收取100元就上交一次,最后的員工到達后,經理將剩余的錢上交了,符合預期

員工 5 收取了 45 元
員工 9 收取了 47 元
員工 11 收取了 24 元
員工 4 收取了 56 元
員工 3 收取了 68 元
員工 7 收取了 11 元
員工 1 收取了 99 元
員工 8 收取了 76 元
員工 10 收取了 30 元
員工 2 收取了 10 元
員工 6 收取了 39 元
最后的員工到達后,經理將剩余的 47 元交給上級
經理收到了 47 元,總金額:47
經理收到了 68 元,總金額:115
經理將 115 元交給上級
經理收到了 45 元,總金額:45
經理收到了 11 元,總金額:56
經理收到了 24 元,總金額:80
經理收到了 99 元,總金額:179
經理將 179 元交給上級
經理收到了 56 元,總金額:56
經理收到了 76 元,總金額:132
經理將 132 元交給上級
經理收到了 30 元,總金額:30
經理收到了 10 元,總金額:40
經理收到了 39 元,總金額:79

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

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

相關文章

ADC(二):外部觸發

有關ADC的基礎知識請參考標準庫入門教程 ADC&#xff08;二&#xff09;&#xff1a;外部觸發 1、TIM1的CC1事件觸發ADC1DMA重裝載2、TIM3的TRGO事件(的更新事件)觸發ADC1DMA重裝載3、TIM3的TRGO事件(的捕獲事件)觸發ADC1DMA重裝載4、優化TIM3的TRGO事件(的捕獲事件)觸發ADC1D…

磁盤分區格式

MBR和GPT ?磁盤分區形式主要有兩種&#xff1a;MBR和GPT。?? MBR&#xff08;Master Boot Record&#xff09; MBR是一種較舊的分區形式&#xff0c;首次引入于1983年的IBM PC DOS 2.0。它位于驅動器的第一個扇區&#xff0c;包含460字節的引導代碼、64字節的磁盤分區表和…

幾個支持用戶名密碼的代理鏈工具: glider, gost, proxychains+microsocks

幾個支持用戶名密碼的代理鏈工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost&#xff1a;(https://github.com/ginuerzh/gost) 參考 https://www.quakemachinex.com/blog/279.html

量子退火與機器學習(1):少量數據求解未知QUBO矩陣,以少見多

文章目錄 前言ー、復習QUBO&#xff1a;中藥配伍的復雜性1.QUBO 的介入&#xff1a;尋找最佳藥材組合 二、難題&#xff1a;QUBO矩陣未知的問題1.為什么這么難&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系統中的稀疏解2. L1和L2的選擇&#xff1a; 三、壓縮感知算法(C…

【連續學習之SSL算法】2018年論文Selfless sequential learning

1 介紹 年份&#xff1a;2018 期刊&#xff1a; arXiv preprint Aljundi R, Rohrbach M, Tuytelaars T. Selfless sequential learning[J]. arXiv preprint arXiv:1806.05421, 2018. 本文提出了一種名為SLNID&#xff08;Sparse coding through Local Neural Inhibition and…

關于SNAT、DNAT及浮動地址

SNAT、DNAT SNAT、DNAT就是實現代理的功能。 SNAT 類似于客戶端代理&#xff1a;內網主機通過共享公網 IP 地址訪問外部服務。DNAT 類似于服務端代理&#xff1a;外部請求通過公網 IP 轉發到內網主機上的服務。 沒有大網地址的內部主機想要作為客戶端訪問外部網絡&#xff08;主…

結構方程模型【SEM】:嵌套分層數據及數據分組分析

結構方程模型&#xff08;System of Equations Model&#xff0c;簡稱SEM&#xff09;&#xff0c;在生態學和環境科學中通常指的是一組描述生態系統中能量、物質和信息流動的數學方程。這些方程可以是確定性的&#xff0c;也可以是隨機的&#xff0c;它們共同構成了一個模型&a…

hot100_56. 合并區間

以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。 請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。數據結構 二維鏈表存儲每個區間 方法 先對每個區間的…

Python大數據:基于Python的王者榮耀戰隊數據分析系統的設計與實現

系統展示 比賽信息管理 看板展示 系統管理 摘要 本文使用Python與MYSQL技術搭建了一個王者榮耀戰隊的數據分析系統。對用戶提出的功能進行合理分析&#xff0c;然后搭建開發平臺以及配置計算機軟硬件&#xff1b;通過對數據流圖以及系統結構的設計&#xff0c;創建相應的數據…

兩分鐘解決:vscode卡在設置SSH主機,VS Code-正在本地初始化VSCode服務器

問題原因 remote-ssh還是有一些bug的&#xff0c;在跟新之后可能會一直加載初始化SSH主機解決方案 1.打開終端2.登錄鏈接vscode的賬號&#xff0c;到家目錄下3.找到 .vscode-server文件,刪掉這個文件4.重啟 vscode 就沒問題了

深入理解與優化Java二維數組:從定義到性能提升的全面指南

1. 定義和初始化二維數組 在Java中&#xff0c;二維數組可以看作是數組的數組。你可以將它想象成一個矩陣或表格&#xff0c;每個元素是一個數組。 1.1 定義二維數組 二維數組的定義語法如下&#xff1a; datatype[][] arrayName;datatype 是數組元素的數據類型。arrayName…

day26 文件io

函數接口 1 .open和close 文件描述符&#xff1a;系統為用open打開的文件分配的標識符 非負的整形數據 0-1023 最小未被使用原則 使用完時及時釋放&#xff0c;避免文件描述符溢出 文件描述溢出就是文件使用完沒有及時關閉文件 int open(const char *pathname, int flags); /…

Java Stream流詳解——串行版

Stream流——串行版 ? Stream流是java8引入的特性&#xff0c;極大的方便了我們對于程序內數據的操作&#xff0c;提高了性能。通過函數式編程解決復雜問題。 1.BaseStream<T,S extense BaseStream<T,S>> ? 他是流處理的基石概念&#xff0c;重點不在于這個接…

el-backtop(返回頂部)

案例&#xff1a; <el-backtop target".app-main"><svg-icon icon-class"backtop" size"24px" /></el-backtop>

探秘“香水的 ChatGPT”:AI 開啟嗅覺奇幻之旅!

你沒有看錯&#xff0c;AI也能聞到味道了&#xff01;這是一家名為Osmo公司公布的信息&#xff0c;他們成功創造出了由AI生成的李子味道&#xff0c;快跟著小編一探究竟吧~ 【圖片來源于網絡&#xff0c;侵刪】 Osmo公司的這項技術&#xff0c;通過分析香味的化學成分和人類嗅…

Vue3入門(9)

1. 【 replace屬性】 作用&#xff1a;控制路由跳轉時操作瀏覽器歷史記錄的模式。 瀏覽器的歷史記錄有兩種寫入方式&#xff1a;分別為push和replace&#xff1a; - push是追加歷史記錄&#xff08;默認值&#xff09;。 - replace是替換當前記錄。 . 開啟replace模式&#xff…

第十九章 C++ 日期 時間

C 日期 & 時間 C 標準庫沒有提供所謂的日期類型。C 繼承了 C 語言用于日期和時間操作的結構和函數。為了使用日期和時間相關的函數和結構&#xff0c;需要在 C 程序中引用 <ctime> 頭文件。 有四個與時間相關的類型&#xff1a;clock_t、time_t、size_t 和 tm。類型…

電子配件行業的未來之路:產品說明書數字化轉型的力量

在科技飛速發展的今天&#xff0c;電子配件行業作為科技創新的前沿陣地&#xff0c;正經歷著前所未有的變革。從智能手機、平板電腦到智能穿戴設備&#xff0c;各種新型電子配件層出不窮&#xff0c;極大地豐富了人們的生活。然而&#xff0c;隨著產品種類的增多和功能的復雜化…

強化學習方法分類詳解

強化學習方法分類詳解 引言 強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種通過智能體與環境互動來學習如何做出最佳決策的方法。根據不同的優化中心、策略特性、環境模型、獎勵函數、動作空間類型以及行為策略和目標策略的一致性&#xff0c;RL可以分為…

RockyLinux介紹及初始化

文章目錄 一、背景二、下載 RockyLinux9 鏡像三、環境初始化四、安裝 Docker 環境 一、背景 這里講一個小故事&#xff1a; 我們都知道Linux 內核是由芬蘭計算機科學家林納斯托瓦茲 (Linus Torvalds) 于 1991 年首次開發的&#xff0c;隨后有一個非常重要的公司RetHat成立&am…