Java 7 を使用していることを確認し、Phaserを使用してください。Phaser は、K-1 がフェーズになる、箱から出してこれを実現します。
次に例を示します。
int waitForPhase = K-1;
ExecutorService e = Executors.newFixedThreadPool(n);
Phaser phaser = new Phaser(n);
for(int i=0; i< n ;i++){
e.submit(new Runnable(){
public void run(){
for(j =0 ;j < waitForPhase ; j++){
//do work
phaser.arriveAndAwaitAdvance();
// if you do not want all sub threads to wait for each
// this can also be phaser.arrive()
}
}
});
}
phaser.awaitAdvance(waitForPhase);
そのため、開始時にn
フェイザーに登録されたパーティーがあります。スレッドが 1 つになるたびarriveAndAwaitAdvance
に、すべてのスレッドがそのバリアに到達するまで待機します。すべてのスレッドがそのバリアに到達すると、フェーズがインクリメントされます。フェーズが K-1 に達すると、呼び出し元のスレッドがブレークアウトします。
phaser.awaitAdvance(waitForPhase);
最後のステートメントが満たされた後
現在のスレッドは、前のスレッドがブロックできるようになるまでブロックします
編集:
awaitAdvance(int phase)
Phaser の現在のフェーズが引数として渡されたフェーズになるまで、現在のスレッドを中断します。すべてのスレッドが到着し、現在のスレッドで渡されたフェーズ番号が増加すると、起動するように通知されます。