三、使用示例:
phaser是一類執行緒輔助類,它可用於在多個執行緒間,在執行過程多個點的每個點進行同步,同時在每個同步點還可執行自定義操作。
2.1 new phaser(n)
定義n個需同步的執行緒,當然也可以執行緒提交執行前使用phaser.register()進行註冊;
2.2 重寫onadvance方法
重寫phase的boolean onadvance(int phase, int registeredparties)方法(若無需要可以不重寫,忽略該步),裡面可自定義每個同步點的處理,注意返回值,true表示phase應該結束,false表示不結束
2.3 phaser.arriveandawaitadvance()
這是在每個執行執行緒中,當到每達同步點時,呼叫。此時執行執行緒會等待其它執行緒,都到齊後才會接著執行後面的操作
2.4 phaser.arriveandderegister()
這是在每個執行執行緒中,當執行緒執行結束時,呼叫,表示操作執行結束,不再需要同步,取消phaser的註冊
2.5 phaser.isterminated()
主線程檢測各執行緒是否已經執行完成,或者說是phaser生命週期已結束,各階段已經完成
public
class
phasermain};
system.out.
println
(thread.
currentthread()
.getname()
+" game start");
executorservice es = executors.
newcachedthreadpool()
;for
(int i=
0;i<
3;i++
)while
(!phaser.
isterminated()
) system.out.
println
(thread.
currentthread()
.getname()
+" game over");
es.shutdown()
;}static
class
runner
implements
callable
@override
public
final string call()
throws exception
}}
執行結果如下:
main game start
pool-1-thread-3 phase 0 ; registerparties 3
pool-1-thread-3 run 1
pool-1-thread-2 run 1
pool-1-thread-1 run 1
pool-1-thread-1 phase 1 ; registerparties 3
pool-1-thread-3 run 2
pool-1-thread-2 run 2
pool-1-thread-1 run 2
pool-1-thread-1 phase 2 ; registerparties 3
pool-1-thread-2 run 3
pool-1-thread-3 run 3
pool-1-thread-1 run 3
pool-1-thread-1 phase 3 ; registerparties 0
main game over
執行緒十九 Phaser
phaser構建了乙個更加靈活的同步屏障,和前面文章中提到的countdownlatch與cyclicbarrier屏障器一樣,phaser也能使得一組執行緒在屏障上等待,在最後一條執行緒到達之後,這些執行緒就能繼續執行了。phaser的靈活在於它可以協調不定數目的執行緒,執行緒可以在任何時刻加入。...
多執行緒同步輔助類
同步輔助類之訊號量 允許指定共享資源數量,可以允許指定數量的執行緒同時訪問資源 與同步的區別在於,同步時,一次只能乙個執行緒訪問資源 author administrator public class semaphoredemo catch interruptedexception e start ...
029 執行緒輔助類 Exchanger
一 概述 該類描述的是乙個交換空間,我們可以理解為我們的生產者和消費者模型之中的緩衝區.二 類結構 構造方法 public exchanger 這個類的構造需要乙個泛型,表示需要交換的資料.exchange 交換資料.當傳入null的時候表示從緩衝區中獲取資料.三 例子 我們模擬乙個生產者和消費者的...