CountDownLatch簡單入門

2021-10-24 19:19:41 字數 2061 閱讀 3735

在多執行緒的開發中,有時候會遇到執行緒間需要互相配合的業務操作,比如

某乙個執行緒需要其他幾個執行緒執行完了之後再執行 (乙個等多個)

一些執行緒需要在某個時刻同時執行,就像等待裁判員槍響後,才能同時起跑(多個等乙個)

此時就不太好控制線程執行的順序了,需要使用countdownlatch這個類。

countdownlatch也是乙個同步功能的輔助類,使用效果是給定乙個計數,當使用這個countdownlatch類的執行緒判斷計數不為0時,則呈wait狀態,如果為0時則繼續執行。實現等待與繼續執行的效果分別需要使用await()和countdown()方法來進行。呼叫await()方法時判斷計數是否為0,如果不為0則呈等待狀態。其他執行緒可以呼叫count-down()方法將計數減1,當計數減到為0時,呈等待的執行緒繼續執行。而方法getcount()就是獲得當前的計數個數。

例子一(乙個等多個)

假如你是學校實驗樓的鎖門大爺,每天晚上11點之後,實驗樓是要鎖門的,你就得在所有學生都出來之後才能鎖門,每個學生出來都是乙個執行緒(每個學生出來的時間都不一樣),而你鎖門就是這個最後執行的執行緒,必須等他們都出來之後才能鎖門。

public

static

void

main

(string[

] args)

throws exception

catch

(interruptedexception e)

}, string.

valueof

(i))

.start()

;}countdownlatch.

await()

; system.out.

println

("你們終於都離開了,我要鎖門了");

}}

執行結果

例子二(多個等乙個)

假如你上學期就顧著打遊戲而沒有學習的話,那麼你肯定是掛科了,然後你就需要補考了,補考的考生乙個個的進了教室後,等人都到齊了,監考老師才開始發卷子,然後開始考試,這個過程很重要,每個考生都是乙個執行緒,都有乙個任務要處理(那就是考試),但是這個任務硬生生被分成了2部分,一部分進入教室,等待監考老師發卷子,然後等監考老師這個執行緒執行完任務(發卷子)後,考生才能開始考試,這就是個多個等乙個問題。

public

static

void

main

(string[

] args)

throws exception

catch

(interruptedexception e)

}, string.

valueof

(i))

.start()

;}timeunit.seconds.

sleep(1

);system.out.

println

("全部考生已經就位,坐等監考老師到來");

system.out.

println

("老師進入考場了,開始發卷子了");

countdownlatch.

countdown()

;}

執行結果如下

);countdownlatch初始值裡的數字就是乙個計數器,每次呼叫countdown()方法,就會減1,一直減到0為止,一旦減到0的時候,凡是阻塞在countdownlatch的await()方法上的執行緒都會被喚醒,繼續執行下去。但是countdownlatch 的計數無法被重置,如果需要重置計數,請考慮使用cyclicbarrier類。

多執行緒 CountDownLatch

countdownlatch 允許乙個或多個執行緒等待其他執行緒完成操作。應用場景 假如有這樣乙個需求,當我們需要解析乙個excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析乙個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中,要實現主線程...

執行緒同步 CountDownLatch

應用場景 有乙個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務呼叫乙個countdownlatch物件的await 方法,其他的任務執行完自己的任務後呼叫同乙個countdownlatch物件上的countdown 方法,這個呼叫await ...

CountDownLatch 併發測試

countdownlatch,乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。主要方法 public countdownlatch int count public voidcountdown public voidawait throws interrup...