執行緒輔助類 五 Phaser

2021-10-03 21:54:07 字數 1830 閱讀 9745

三、使用示例:

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的時候表示從緩衝區中獲取資料.三 例子 我們模擬乙個生產者和消費者的...