CountDownLatch和執行緒池

2021-10-06 01:45:25 字數 1926 閱讀 5042

list list =

newarraylist

();for

(int i=

0;i<

100000

;i++

)int threadnum = list.

size()

%200==0

? list.

size()

/200+1

:list.

size()

/200

; countdownlatch countthread =

newcountdownlatch

(threadnum)

;for

(int i =

0; i< threadnum ; i++

)catch

(exception e)

finally}}

).start()

;}trycatch

(interruptedexception e)

countdownlatch的建構函式接收乙個 int型引數作為計數器,例如想讓n任務完成之後才能繼續執行,建立countdownlatch時傳入引數n;

需要等待的執行緒會呼叫countdownlatch的await方法,該執行緒就會阻塞直到計數器的值減為0,而達到自己預期的執行緒會呼叫countdownlatch的countdown()方法,計數器n的值減1。由於countdown方法可以在任何地方呼叫,所以計數器n既可以代表n個執行緒,也可以是乙個執行緒的n個執行步驟。代表多個執行緒時,只需要將這個countdownlatch的引用傳到執行緒裡面即可。

n的值為1時,退化為單一事件,即由乙個執行緒來通知其他執行緒,效果等同於物件的wait和notifyall;n為0時,呼叫await方法不會阻塞當前執行緒

這只是簡化的例子 ,做某個操作的時候,我們可以用多執行緒批量操作,加快效率。(當我看到這段**彷彿開啟了乙個新世界0-0)

為什麼要用執行緒池:

1.減少了建立和銷毀執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務。

2.可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(每個執行緒需要大約1mb記憶體,執行緒開的越多,消耗的記憶體也就越大,最後宕機)。

靜態方法建立執行緒池

executorservice pool = executors.

newsinglethreadexecutor()

;//建立實現了runnable介面物件,thread物件當然也實現了runnable介面

thread t1 =

newmythread()

; thread t2 =

newmythread()

; thread t3 =

newmythread()

; thread t4 =

newmythread()

; thread t5 =

newmythread()

;//將執行緒放入池中進行執行

pool.

execute

(t1)

; pool.

execute

(t2)

; pool.

execute

(t3)

; pool.

execute

(t4)

; pool.

execute

(t5)

;//關閉執行緒池

pool.

shutdown()

;

其他方法不一一舉例

參考資料:

CountDownLatch的理解和使用

countdownlatch概念 countdownlatch是乙個同步工具類,用來協調多個執行緒之間的同步,或者說起到執行緒之間的通訊 而不是用作互斥的作用 countdownlatch能夠使乙個執行緒在等待另外一些執行緒完成各自工作之後,再繼續執行。使用乙個計數器進行實現。計數器初始值為執行緒的...

多執行緒 CountDownLatch

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

執行緒同步 CountDownLatch

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