JUC學習之CountDownLatch入門

2021-10-03 07:19:11 字數 1553 閱讀 4684

官網的介紹如下:

countdownlatch:允許乙個或多個執行緒等待直到在其他執行緒中執行的一組操作完成的同步輔助。

countdownlatch用給定的計數初始化。 await方法阻塞,直到由於countdown()方法的呼叫而導致當前計數達到零,之後所有等待執行緒被釋放,並且任何後續的await 呼叫立即返回。

countdownlatch使乙個執行緒等待其他執行緒各自執行完畢後再執行,是通過乙個計數器來實現的,計數器的初始值是執行緒的數量。每當乙個執行緒執行完畢後,計數器的值就-1,當計數器的值為0時,表示所有執行緒都執行完畢,然後在閉鎖上等待的執行緒就可以恢復工作了。

//引數count為計數值,一般為執行緒

public countdownlatch(int count)

void

await()

呼叫await()方法的執行緒會被掛起,它會等待直到count值為0才繼續執行

boolean

await(long timeout, timeunit unit)

和await()類似,只不過等待一定的時間後count值還沒變為0的話就會繼續執行

void

countdown()

將count值減1

long

getcount()

返回當前count值

countdownlatch的乙個非常典型的應用場景是:有乙個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務呼叫乙個countdownlatch物件的await()方法,其他的任務執行完自己的任務後呼叫同乙個countdownlatch物件上的countdown()方法,這個呼叫await()方法的任務將一直阻塞等待,直到這個countdownlatch物件的計數值減到0為止。

舉個例子:

五個學生,乙個老師,學生們都在自習,只有老師才有教室的一把鑰匙,老師必須等到5個學生都離開教室之後才能鎖門,不可能學生還沒走老師就把教室給鎖了,顯然存在乙個執行緒阻塞等待另外的執行緒必須完成之後才可以執行的場景。

**實現:

public class t01_countdownlatch  catch (interruptedexception e) 

system.out.println("學生" + num + "離開教室...");

//將計數器減一

countdownlatch.countdown();

}).start();

}//老師一直在等待,即主線程一直阻塞

try catch (interruptedexception e)

//直到計數器變為0時才執行

system.out.println("所有學生都離開了,老師拿鑰匙鎖門....");

}}

執行結果:

學生4離開教室...

學生1離開教室...

學生2離開教室...

學生3離開教室...

學生5離開教室...

所有學生都離開了,老師拿鑰匙鎖門....

JUC學習之CountDownLatch 閉鎖

1.什麼是countdownlatch 乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或者多個執行緒一直等待,在jdk1.5之後提供 2.什麼是閉鎖?在完成某些運算時,只有其他多有執行緒的運算全部完成,當前運算才繼續執行 上 public class testcountdown...

JUC學習之執行緒8鎖

介紹執行緒8鎖圍繞乙個題目展開,題目 列印的是 one 還是 two 1.兩個普通同步方法,兩個執行緒,列印?public class testthread8monitor start new thread new runnable start class number public synchro...

JUC之讀寫鎖

是什麼?讀寫分離的鎖。locks包下的 lock condition readwritelock 裡面的readwritelock 讀寫鎖 維護了一對讀寫操作。讀的鎖可以共享 又叫共享鎖 寫的鎖獨佔 又叫獨佔鎖 即寫操作只能開始寫 寫結束,中間不能插入任何寫的操作。怎麼用?如果沒有鎖的情況 publ...