cyclicbarrier 字面意思是可迴圈(cyclic)的屏障(barrier),它要做的事情是讓一組執行緒到達屏障時被阻塞,直到最後乙個執行緒也到達屏障,屏障才會開門,所有被屏障攔截的執行緒才會繼續執行。
cyclicbarrier 有兩個構造方法,我們先來看第乙個:
cyclicbarrier
(int parties)
引數parties
表示屏障攔截的執行緒數量,每個執行緒呼叫 await 方法告訴 cyclicbarrier 我已經到達屏障,然後當前執行緒被阻塞,測試**如下:
public
class
testcyclicbarrier
catch
(interruptedexception e)
catch
(brokenbarrierexception e)})
.start()
;try
catch
(interruptedexception e)
catch
(brokenbarrierexception e)
}}
由於子執行緒和主線程的排程是由 cpu 決定的,所以兩個執行緒都有可能先執行,多次執行**後會控制台會有兩種不同的輸出:
// 第一種輸出12
// 第二種輸出
21
如果把上面**中的new cyclicbarrier(2)
改為new cyclicbarrier(3)
,則主線程和子執行緒會永遠等待,因為沒有第三個執行緒執行 await 方法,所以前兩個執行緒會一直在屏障處等待。
接下來我們來看第二個構造器:
測試**如下:
public
class
testcyclicbarrier);
public
static
void
main
(string[
] args)
catch
(interruptedexception e)
catch
(brokenbarrierexception e)})
.start()
;try
catch
(interruptedexception e)
catch
(brokenbarrierexception e)
}}
控制台輸出如下(多次執行結果會不同):
thread-
0我是子執行緒
我是主線程
cyclicbarrier 可用於多執行緒計算資料,最後合併計算結果的場景。例如,乙個 excel 儲存了使用者所有銀行流水,每個 sheet 儲存了乙個賬戶近一年的每筆銀行流水,現在需要統計使用者的日均銀行流水,先用多執行緒處理每個 sheet 裡的銀行流水,都執行完之後,得到每個 sheet 的日均銀行流水,最後再通過 barrieraction 用這些執行緒的計算結果,計算出整個 excel 的日均銀行流水,**如下圖所示:
public
class
bankwaterservice
implements
runnable
system.out.
println
(result);}
private
void
count()
catch
(interruptedexception e)
catch
(brokenbarrierexception e)})
;}}public
static
void
main
(string[
] args)
}
控制台輸出如下:
執行緒 pool-
1-thread-
1 計算完成
執行緒 pool-
1-thread-
3 計算完成
執行緒 pool-
1-thread-
4 計算完成
執行緒 pool-
1-thread-
2 計算完成
400
它們之間最大的區別在於:countdownlatch 只能攔截一輪,而 cyclicbarrier 可以實現迴圈攔截。
此外,countdownlatch 還提供了 reset()、getnumberwaiting()、isbroken() 等比較有用的方法。
推薦一篇非常不錯的文章:深入理解cyclicbarrier原理
併發工具類之 Exchanger
exchanger 交換者 是乙個用於執行緒間協作的工具類。exchanger 用於進行執行緒間的資料交換。兩個執行緒通過exchange 方法交換資料,第乙個執行緒執行到exchange 方法後會一直等待第二個執行緒也執行exchange 方法,當兩個執行緒都到達同步點後,這兩個執行緒就可以交換資...
Java併發工具類之CyclicBarrier
cyclicbarrier的意思是可迴圈使用的屏障。它可以讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有阻塞的執行緒才會繼續執行。它就好像一道關卡,只有所有的部隊 執行緒 都到了才能放行。部分原始碼 public class cyclicbarrier 可以看到,...
七 併發工具類之CountDownLatch
乙個執行緒需要等到其他執行緒進行某操作時,可以使用countdownlatch。countdownlatch構造方法,帶有乙個int型別的引數。public countdownlatch int count 當乙個執行緒呼叫countdownlatch.await 時,執行緒會等待。直到其他執行緒執...