CyclicBarrier、CountDownLatch、Semaphore 的用法

CyclicBarrier、CountDownLatch、Semaphore 的用法

CountDownLatch(線程計數器 )

CountDownLatch 類位于 java.util.concurrent 包下,利用它可以實現類似計數器的功能。比如有一個任務 A,它要等待其他 4 個任務執行完畢之后才能執行,此時就可以利用 CountDownLatch來實現這種功能了。

final CountDownLatch latch = new CountDownLatch(2);
new Thread() {public void run() {System.out.println("子線程" + Thread.currentThread().getName() + "正在執行");Thread.sleep(3000);System.out.println("子線程" + Thread.currentThread().getName() + "執行完畢");latch.countDown();};
}.start();new Thread() {public void run() {System.out.println("子線程" + Thread.currentThread().getName() + "正在執行");Thread.sleep(3000);System.out.println("子線程" + Thread.currentThread().getName() + "執行完畢");latch.countDown();};
}.start();System.out.println("等待 2 個子線程執行完畢...");latch.await();System.out.println("2 個子線程已經執行完畢");System.out.println("繼續執行主線程");
CyclicBarrier(回環柵欄-等待至 barrier 狀態再全部同時執行)

字面意思回環柵欄,通過它可以實現讓一組線程等待至某個狀態之后再全部同時執行。叫做回環是因為當所有等待線程都被釋放以后,CyclicBarrier 可以被重用。我們暫且把這個狀態就叫做barrier,當調用 await()方法之后,線程就處于 barrier 了。

CyclicBarrier 中最重要的方法就是 await 方法,它有 2 個重載版本:

  1. public int await():用來掛起當前線程,直至所有線程都到達 barrier 狀態再同時執行后續任務;

  2. public int await(long timeout, TimeUnit unit):讓這些線程等待至一定的時間,如果還有線程沒有到達 barrier 狀態就直接讓到達 barrier 的線程執行后續任務。

具體使用如下,另外 CyclicBarrier 是可以重用的。

public static void main (String[]args){int N = 4;CyclicBarrier barrier = new CyclicBarrier(N);for (int i = 0; i < N; i++)new Writer(barrier).start();}static class Writer extends Thread {private CyclicBarrier cyclicBarrier;public Writer(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {try {Thread.sleep(5000); //以睡眠來模擬線程需要預定寫入數據操作System.out.println("線程" + Thread.currentThread().getName() + "寫入數據完畢,等待其他線程寫入完畢");cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("所有線程寫入完畢,繼續處理其他任務,比如數據操作");}}
Semaphore(信號量-控制同時訪問的線程個數)

Semaphore 翻譯成字面意思為 信號量,Semaphore 可以控制同時訪問的線程個數,通過acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。

Semaphore 類中比較重要的幾個方法:

  1. public void acquire(): 用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。

  2. public void acquire(int permits):獲取 permits 個許可

  3. public void release() { } :釋放許可。注意,在釋放許可之前,必須先獲獲得許可。

  4. public void release(int permits) { }:釋放 permits 個許可

上面 4 個方法都會被阻塞,如果想立即得到執行結果,可以使用下面幾個方法

  1. public boolean tryAcquire():嘗試獲取一個許可,若獲取成功,則立即返回 true,若獲取失敗,則立即返回 false

  2. public boolean tryAcquire(long timeout, TimeUnit unit):嘗試獲取一個許可,若在指定的時間內獲取成功,則立即返回 true,否則則立即返回 false

  3. public boolean tryAcquire(int permits):嘗試獲取 permits 個許可,若獲取成功,則立即返回 true,若獲取失敗,則立即返回 false

  4. public boolean tryAcquire(int permits, long timeout, TimeUnit unit): 嘗試獲取 permits個許可,若在指定的時間內獲取成功,則立即返回 true,否則則立即返回 false

  5. 還可以通過 availablePermits()方法得到可用的許可數目。

例子:若一個工廠有 5 臺機器,但是有 8 個工人,一臺機器同時只能被一個工人使用,只有使用完了,其他工人才能繼續使用。那么我們就可以通過 Semaphore 來實現:

 int N = 8; //工人數Semaphore semaphore = new Semaphore(5); //機器數目for(int i=0;i<N;i++)new Worker(i,semaphore).start();}
static class Worker extends Thread {private int num;private Semaphore semaphore;public Worker(int num, Semaphore semaphore) {this.num = num;this.semaphore = semaphore;}@Overridepublic void run() {try {semaphore.acquire();System.out.println("工人" + this.num + "占用一個機器在生產...");Thread.sleep(2000);System.out.println("工人" + this.num + "釋放出機器");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}
}

? CountDownLatch 和 CyclicBarrier 都能夠實現線程之間的等待,只不過它們側重點不同;CountDownLatch 一般用于某個線程 A 等待若干個其他線程執行完任務之后,它才執行;而 CyclicBarrier 一般用于一組線程互相等待至某個狀態,然后這一組線程再同時執行;另外,CountDownLatch 是不能夠重用的,而 CyclicBarrier 是可以重用的。? Semaphore 其實和鎖有點類似,它一般用于控制對某組資源的訪問權限。

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

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

相關文章

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列 1、隊列&#xff1a;先進先出 隊列是項的有序集合&#xff0c;其中&#xff0c;添加新項的一端稱為隊尾&#xff0c;移除項的另一端稱為隊首。一個元素在從隊尾進入隊列后&#xff0c;就會一直向隊首移動&#xff0c;直到…

鴻蒙原生應用再添新丁!同花順入局鴻蒙

鴻蒙原生應用再添新丁&#xff01;同花順入局鴻蒙 來自 HarmonyOS 微博12月11日消息&#xff0c;同花順已完成#鴻蒙原生應用#beta版本&#xff0c;并正在進行全量版本開發&#xff0c;進一步豐富了#鴻蒙原生應用#的覆蓋領域。同花順作為股民和券商首選的一站式金融理財服務平臺…

擴展學習|商業智能和分析:從大數據到大影響

文獻來源&#xff1a;Chen H, Chiang R H L, Storey V C. Business intelligence and analytics: From big data to big impact[J]. MIS quarterly, 2012: 1165-1188. 下載鏈接&#xff1a;https://pan.baidu.com/s/1JoHcTbwdc1TPGnwXsL4kIA 提取碼&#xff1a;a8uy 在不同的組…

MySQL忘記密碼

根據提供的引用內容&#xff0c;當使用root用戶登錄MySQL時&#xff0c;如果密碼錯誤&#xff0c;會出現"Access denied for user ‘root’‘localhost’ (using password: NO)"的錯誤提示。這個錯誤提示表示使用了錯誤的密碼或者沒有輸入密碼就嘗試登錄MySQL。解決這…

SQL命令---查看數據庫表

介紹 使用sql命令查看數據表。 命令 show create table 表名\G;\G&#xff1a;使顯示結果整齊美觀。

Vue-第七天

智慧商城項目&#xff1a; 1.創建項目選項&#xff1a; 2.調整&#xff1a; 主要是增加兩個文件夾&#xff0c;刪除倒是沒什么 3.組件庫&#xff08;vant-ui&#xff09;&#xff1a; 點擊進入官網:Vant 2 - Mobile UI Components built on Vue 4.導入&#xff1a; 全部導入…

MES系統需要具備哪些性能方面的需求?

MES系統需要具備哪些“性能需求”&#xff1f;關于這個問題&#xff0c;我覺得有必要先和大家解釋一下&#xff0c;到底什么是性能需求&#xff1f;性能需求在MES系統的作用是什么&#xff1f;講明白了這2點&#xff0c;問題自然而然就解決了。 什么是性能需求&#xff1f; 通…

選擇最適合您的數據集成工具

個人 對于個人而言&#xff0c;選擇最適合的數據集成工具可能會有一些不同的考量因素。以下是一些個人選擇數據集成工具時可能需要考慮的因素&#xff1a; 技術水平和經驗&#xff1a; 如果個人具有較深的技術水平和經驗&#xff0c;可能更傾向于選擇功能豐富、靈活性強的數據…

自編碼器 AutoEncoder

自編碼器&#xff08;AutoEncoder&#xff09;&#xff0c;也稱自編碼模型&#xff0c;是一種基于無監督學習的數據維度壓縮和特征表示方法&#xff0c;目的是對一組數據學習出一種表示。1986年 Rumelhart 提出自編碼模型用于高維復雜數據的降維。由于自動編碼器通常應用于無監…

《PySpark大數據分析實戰》-02.了解Hadoop

&#x1f4cb; 博主簡介 &#x1f496; 作者簡介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 熱衷于各種主流技術&#xff0c;熱愛數據科學、機器學習、云計算、人工智能。 通過了TiDB數據庫專員&#xff08;PCTA&#xff09;、TiDB數據庫專家&#xff08;PCTP…

Leetcode 2962. Count Subarrays Where Max Element Appears at Least K Times

Leetcode 2962. Count Subarrays Where Max Element Appears at Least K Times 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2962. Count Subarrays Where Max Element Appears at Least K Times 1. 解題思路 這一題思路上同樣很直接&#xff0c;就是找到最大的元素所在的全…

云降水物理基礎

云降水物理基礎 云的分類 相對濕度變化方程 由相對濕度的定義&#xff0c;兩邊取對數之后可以推出 聯立克勞修斯-克拉佩龍方程&#xff08;L和R都為常數&#xff09; 由右式看出&#xff0c;增加相對濕度的方式&#xff1a;增加水汽&#xff08;de增大&#xff09;和降低…

開源好用EasyImages簡單圖床源碼

源碼介紹 開源好用EasyImages簡單圖床源碼分享&#xff0c;雖然它是開源程序&#xff0c;但功能一點也不弱&#xff0c;不僅支持多文件上傳、文字/圖片水印、支持API和鑒黃、還能自定義代碼&#xff0c;最重要的是它不強制使用數據庫運行&#xff0c;這就給我們的部署和維護帶…

人工智能的技術演進與未來趨勢

人工智能的技術演進與未來趨勢 一、引言 人工智能&#xff08;AI&#xff09;已經成為當今科技領域的熱門話題&#xff0c;其在各個行業的應用越來越廣泛。從智能語音助手到自動駕駛汽車&#xff0c;從智能家居系統到醫療診斷&#xff0c;AI技術已經深入到我們的日常生活。在…

OpenVINS學習2——VIRAL數據集eee01.bag運行

前言 周末休息了兩天&#xff0c;接著做上周五那個VIRAL數據集沒有運行成功的工作。現在的最新OpenVINS需要重新寫配置文件&#xff0c;不像之前那樣都寫在launch里&#xff0c;因此需要根據數據集情況配置好estimator_config.yaml還有兩個標定參數文件。 VIRAL數據集 VIRAL…

WooCommerce商城個人微信支付網關 適合個人微信收款

點擊獲取WooCommerce商城個人微信支付網關 適合個人微信收款原文https://gplwp.eastfu.com/product/woocommerce-ge-ren-wei-xin-zhi-fu-wang-guan-shi-he-ge-ren/ 個人微信支付網關接口&#xff0c;無需提現&#xff0c;100%資金安全&#xff0c;官方清算&#xff0c;金額無限…

壓力測試過程中出現線程死鎖情況如何解決

確認問題是線程死鎖的方法有以下幾種&#xff1a; 1. 分析日志&#xff1a;查看應用程序的日志&#xff0c;如果發現有線程死鎖的日志信息&#xff0c;可以確認問題是線程死鎖。 2. 使用線程分析工具&#xff1a;可以使用線程分析工具&#xff0c;例如Java的jstack工具&#xf…

axios的使用

Axios 是一個基于 promise 的 HTTP 庫&#xff0c;可以用在瀏覽器和 node.js 中。 如果您想在瀏覽器中使用 Axios&#xff0c;首先需要安裝它。您可以使用 npm&#xff08;Node 包管理器&#xff09;或 yarn 來安裝 Axios。例如&#xff0c;在命令行中輸入以下命令&#xff1a…

Docker 容器運行實戰:從啟動到停止一切你想知道的

要啟動一個新的容器&#xff0c;我們使用 docker run 命令&#xff0c;后跟鏡像名稱。基本語法如下&#xff1a; docker run [選項] 鏡像 [COMMAND] [ARG...] 例如&#xff0c;要運行官方的 Nginx 鏡像&#xff0c;我們可以使用&#xff1a; docker run -d -p 8080:80 nginx…

IoTDB服務安裝教程-集群版

文章目錄 官方說明文檔下載地址服務安裝節點服務分配修改配置文件修改堆內存啟動集群啟動第一個節點啟動其他兩個節點的 ConfigNode 和 DataNode檢驗集群狀態修改集群密碼 【附錄】清理環境 集群擴容修改配置擴容驗證擴容結果 集群縮容縮容一個 ConfigNode縮容一個 DataNode驗證…