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;這只是簡化的例子 ,做某個操作的時候,我們可以用多執行緒批量操作,加快效率。(當我看到這段**彷彿開啟了乙個新世界0-0)需要等待的執行緒會呼叫countdownlatch的await方法,該執行緒就會阻塞直到計數器的值減為0,而達到自己預期的執行緒會呼叫countdownlatch的countdown()方法,計數器n的值減1。由於countdown方法可以在任何地方呼叫,所以計數器n既可以代表n個執行緒,也可以是乙個執行緒的n個執行步驟。代表多個執行緒時,只需要將這個countdownlatch的引用傳到執行緒裡面即可。
n的值為1時,退化為單一事件,即由乙個執行緒來通知其他執行緒,效果等同於物件的wait和notifyall;n為0時,呼叫await方法不會阻塞當前執行緒
為什麼要用執行緒池:靜態方法建立執行緒池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 ...