3

セマフォを使用してスレッド プロセスを作成しています。

K が与えられた場合、以前のすべてのスレッドが少なくとも K-1 回クリティカル セクションに入ったかどうかを確認できるようにしたいと考えています。そうでない場合、現在のスレッドは、前のスレッドがブロックできるようになるまでブロックされます。

例: K = 3 に設定した場合、現在のスレッドがクリティカル セクションに入る必要がある場合、クリティカル セクションに入る前に、以前のすべてのスレッドが K-1 回 (この場合は 2 回) クリティカル セクションに入ったかどうかを確認する必要があります。

これをJavaで実装できる方法を知っている人はいますか? 前もって感謝します。

4

1 に答える 1

7

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 の現在のフェーズが引数として渡されたフェーズになるまで、現在のスレッドを中断します。すべてのスレッドが到着し、現在のスレッドで渡されたフェーズ番号が増加すると、起動するように通知されます。

于 2012-04-23T18:17:03.427 に答える