Java 7を使用しており、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の現在のフェーズが引数として渡されるフェーズになるまですべてのスレッドが到着し、現在のスレッドで渡されたフェーズ番号への増分が起きるように通知されます。
スレッドの数が事前に分かっていますか? – Gray
これは 'K'のすべての値に当てはまりますか?したがって、スレッドを2回実行する前に、すべてのスレッドを一度実行する必要がありますか? – Gray
はい、スレッドの数を任意に選択して – NuNu