九 java多執行緒之CyclicBarrier

2021-09-17 01:37:09 字數 3728 閱讀 8596

github:

乙個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 cyclicbarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。

cyclicbarrier 支援乙個可選的 runnable 命令,在一組執行緒中的最後乙個執行緒到達之後(但在釋放所有執行緒之前),該命令只在每個屏障點執行一次。若在繼續所有參與執行緒之前更新共享狀態,此屏障操作 很有用。

示例用法:下面是乙個在並行分解設計中使用 barrier 的例子:

class solver

public void run() catch (interruptedexception ex) catch (brokenbarrierexception ex) }}

}public solver(float matrix)

});for (int i = 0; i < n; ++i)

new thread(new worker(i)).start();

waituntildone();

}

在這個例子中,每個 worker 執行緒處理矩陣的一行,在處理完所有的行之前,該執行緒將一直在屏障處等待。處理完所有的行之後,將執行所提供的 runnable 屏障操作,並合併這些行。如果合併者確定已經找到了乙個解決方案,那麼 done() 將返回 true,所有的 worker 執行緒都將終止。

如果屏障操作在執行時不依賴於正掛起的執行緒,則執行緒組中的任何執行緒在獲得釋放時都能執行該操作。為方便此操作,每次呼叫 await() 都將返回能到達屏障處的執行緒的索引。然後,您可以選擇哪個執行緒應該執行屏障操作,例如:

if (barrier.await() == 0)

對於失敗的同步嘗試,cyclicbarrier 使用了一種要麼全部要麼全不 (all-or-none) 的破壞模式:如果因為中斷、失敗或者超時等原因,導致執行緒過早地離開了屏障點,那麼在該屏障點等待的其他所有執行緒也將通過 brokenbarrierexception(如果它們幾乎同時被中斷,則用 interruptedexception)以反常的方式離開。

還是一樣,理論是比較枯燥的,咱們還是舉例來說,比較生動一點.一些教科書舉一些1~100000分批累加例子.咱們不舉這種比較無聊的例子.旅遊,相信很多人都喜歡吧!旅遊的套路一般都出發點集合,入住酒店,到旅遊點1,再到旅遊點2,再到旅遊點3,在集合返回.每次都某乙個地點時.導遊都會清點人數.不要把人給弄丟.ok,開始編碼...

public class tourismrunnable implements runnable

@override

public void run()

/*** 旅遊過程

*/private void tourism()

/*** 裝備返程

*/private void gotoendpoint()

/*** 到達旅遊點3

*/private void gototourismpoint3()

/*** 到達旅遊點2

*/private void gototourismpoint2()

/*** 到達旅遊點1

*/private void gototourismpoint1()

/*** 入住酒店

*/private void gotohotel()

/*** 出發點集合

*/private void gotostartingpoint()

private int getrandomtime() catch (interruptedexception e)

return time;

}private void gotopoint(string point) catch (exception e) }}

在每個旅遊點,每個人旅遊所花的時間是隨機的,有些人玩的比較久一點,有些則走馬觀花,拍拍照就完事了

public class testmain 

});listtourismthread = new arraylist<>();

for (char ch : name.tochararray())

for (thread thread : tourismthread)}}

執行結果:

小剛 花了 131 時間才到了出發點

小黑 花了 237 時間才到了出發點

小麗 花了 250 時間才到了出發點

小紅 花了 335 時間才到了出發點

小明 花了 379 時間才到了出發點

小白 花了 398 時間才到了出發點

小白 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

小紅 花了 128 時間才到了酒店

小剛 花了 156 時間才到了酒店

小黑 花了 240 時間才到了酒店

小白 花了 280 時間才到了酒店

小明 花了 492 時間才到了酒店

小麗 花了 499 時間才到了酒店

小麗 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

小麗 花了 188 時間才到了旅遊點1

小剛 花了 315 時間才到了旅遊點1

小明 花了 374 時間才到了旅遊點1

小白 花了 395 時間才到了旅遊點1

小黑 花了 428 時間才到了旅遊點1

小紅 花了 496 時間才到了旅遊點1

小紅 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

小明 花了 206 時間才到了旅遊點2

小剛 花了 223 時間才到了旅遊點2

小紅 花了 302 時間才到了旅遊點2

小白 花了 308 時間才到了旅遊點2

小黑 花了 317 時間才到了旅遊點2

小麗 花了 400 時間才到了旅遊點2

小麗 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

小白 花了 100 時間才到了旅遊點3

小麗 花了 132 時間才到了旅遊點3

小紅 花了 157 時間才到了旅遊點3

小黑 花了 165 時間才到了旅遊點3

小剛 花了 375 時間才到了旅遊點3

小明 花了 416 時間才到了旅遊點3

小明 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

小剛 花了 100 時間才到了飛機場,準備登機回家

小黑 花了 137 時間才到了飛機場,準備登機回家

小紅 花了 232 時間才到了飛機場,準備登機回家

小明 花了 260 時間才到了飛機場,準備登機回家

小麗 花了 264 時間才到了飛機場,準備登機回家

小白 花了 394 時間才到了飛機場,準備登機回家

小白 清點人數,1,2,3...,ok,人到齊了,準備出發..... go go go....

ok, 執行結果一目了然,中途沒有落下任何乙個人!cyclicbarrier這個類,還是比較容易使用的

JAVA多執行緒之 執行緒池

執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...

Java多執行緒之執行緒安全

當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...

java 多執行緒 之 Excutor

excutor介面 提供了一種將任務提交和任務執行機制相分離的方法 excutorservice介面 提供了excutor的管理介面,以及可為跟蹤乙個或多個非同步任務狀態而生成future的方法 scheduledexcutorservice介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...