併發工具類之 CyclicBarrier

2021-10-13 02:57:55 字數 2638 閱讀 3339

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 時,執行緒會等待。直到其他執行緒執...