JavaTM 2 Platform
Standard Ed. 5.0

java.util.concurrent
クラス CyclicBarrier

java.lang.Object
  上位を拡張 java.util.concurrent.CyclicBarrier

public class CyclicBarrier
extends Object

スレッドセットのそれぞれが共通のバリアポイントに達するまで待機することを可能にする同期化支援機能。CyclicBarrier は、相互に待機することが時折必要になる固定サイズのスレッドパーティが関係するプログラムで有用です。バリアは、待機中のスレッドが解放されたあとで再利用できるため、「循環式」と呼ばれます。

CyclicBarrier は、オプションの Runnable コマンドをサポートします。これは、最後のスレッドが到着したあとで、どのスレッドも解放される前に、バリアポイントごとに 1 回実行されます。この「バリアアクション」は、パーティのいずれかが処理を続行する前に共有状態を更新するのに役立ちます。

使用例: 次に、並列分解設計でのバリアの使用例を示します。


 class Solver {
   final int N;
   final float[][] data;
   final CyclicBarrier barrier;
   
   class Worker implements Runnable {
     int myRow;
     Worker(int row) { myRow = row; }
     public void run() {
       while (!done()) {
         processRow(myRow);

         try {
           barrier.await(); 
         } catch (InterruptedException ex) { 
           return; 
         } catch (BrokenBarrierException ex) { 
           return; 
         }
       }
     }
   }

   public Solver(float[][] matrix) {
     data = matrix;
     N = matrix.length;
     barrier = new CyclicBarrier(N, 
                                 new Runnable() {
                                   public void run() { 
                                     mergeRows(...); 
                                   }
                                 });
     for (int i = 0; i < N; ++i) 
       new Thread(new Worker(i)).start();

     waitUntilDone();
   }
 }
 
ここで、各ワークスレッドは行列の行を処理して、すべての行が処理されるまでバリアで待機します。すべての行が処理されると、指定された Runnable バリアアクションが実行されて、行をマージします。ソリューションが検出されたことをマージャが判別すると、done()true を返して、各ワーカが終了します。

バリアアクションが実行時に中断されたパーティに依存していない場合、そのアクションが解放されると、パーティ内のいずれかのスレッドがそれを実行できます。これを容易にするため、await() の各呼び出しは、バリアの位置でそのスレッドの到着インデックスを返します。その後、バリアアクションを実行するスレッドを選択できます。次に例を示します。

  if (barrier.await() == 0) {
     // log the completion of this iteration
   }

CyclicBarrier は、失敗した同期化の試みに対して、ファストフェイルで全か無かの切断モデルを使用します。割り込み、失敗、またはタイムアウトのためにスレッドがバリアポイントを未成熟なままにしておくと、前の await() から再開されていないスレッドを含む、他のすべてのスレッドでも BrokenBarrierException (これらでもほぼ同時に割り込みが発生する場合は InterruptedException) を介して異常な状態が続きます。

導入されたバージョン:
1.5
関連項目:
CountDownLatch

コンストラクタの概要
CyclicBarrier(int parties)
          指定された数のパーティ (スレッド) が待機状態にある場合に、トリップする新規 CyclicBarrier を作成します。
CyclicBarrier(int parties, Runnable barrierAction)
          指定された数のパーティ (スレッド) が待機状態にある場合に、トリップする新規 CyclicBarrier を作成します。
 
メソッドの概要
 int await()
          すべてのパーティがこのバリアで await を呼び出すまで待機します。
 int await(long timeout, TimeUnit unit)
          すべてのパーティがこのバリアで await を呼び出すまで待機します。
 int getNumberWaiting()
          バリアで待機しているパーティの数を返します。
 int getParties()
          このバリアのトリップに必要なパーティの数を返します。
 boolean isBroken()
          このバリアが故障状態にあるかどうかを問い合わせます。
 void reset()
          バリアを初期状態にリセットします。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

CyclicBarrier

public CyclicBarrier(int parties,
                     Runnable barrierAction)
指定された数のパーティ (スレッド) が待機状態にある場合に、トリップする新規 CyclicBarrier を作成します。バリアのトリップ時には、指定されたバリアアクションが、バリアに入った最後のスレッドにより実行されます。

パラメータ:
parties - バリアがトリップする前に await() を呼び出す必要のあるスレッドの数
barrierAction - バリアのトリップ時に実行するコマンド。アクションが存在しない場合は null
例外:
IllegalArgumentException - parties が 1 未満の場合

CyclicBarrier

public CyclicBarrier(int parties)
指定された数のパーティ (スレッド) が待機状態にある場合に、トリップする新規 CyclicBarrier を作成します。各バリアに対する定義済みのアクションは実行されません。

パラメータ:
parties - バリアがトリップする前に await() を呼び出す必要のあるスレッドの数
例外:
IllegalArgumentException - parties が 1 未満の場合
メソッドの詳細

getParties

public int getParties()
このバリアのトリップに必要なパーティの数を返します。

戻り値:
このバリアのトリップに必要なパーティの数

await

public int await()
          throws InterruptedException,
                 BrokenBarrierException
すべてのパーティがこのバリアで await を呼び出すまで待機します。

現在のスレッドが最後に到着するスレッドではない場合、スレッドのスケジューリングについては無効とされ、次のいずれかが発生するまで待機します。

現在のスレッドで、

InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。

いずれかのスレッドが待機中にバリアで reset() が実行されるか、await の呼び出し時またはいずれかのスレッドが待機中にバリアが破壊された場合、BrokenBarrierException がスローされます。

待機中にいずれかのスレッドで割り込みが発生した場合、待機中の他のスレッドがすべて BrokenBarrierException をスローし、バリアが故障状態に置かれます。

現在のスレッドが到着する最後のスレッドであり、コンストラクタ内で null ではないバリアアクションが指定される場合、現在のスレッドはアクションを実行してから、他のスレッドの続行を許可します。バリアアクション中に例外が発生すると、現在のスレッド内でその例外が送信され、バリアが故障状態に置かれます。

戻り値:
現在のスレッドの到着インデックス。インデックス getParties() - 1 は最初に到着するスレッドを、ゼロは最後に到着するスレッドを示す
例外:
InterruptedException - 待機中に、現在のスレッドで割り込みが発生した場合
BrokenBarrierException - 現在のスレッドの待機中に別のスレッドで割り込みが発生した、バリアがリセットされた、await の呼び出し時にバリアが破壊された、または例外のためにバリアアクション (存在する場合) が失敗した場合

await

public int await(long timeout,
                 TimeUnit unit)
          throws InterruptedException,
                 BrokenBarrierException,
                 TimeoutException
すべてのパーティがこのバリアで await を呼び出すまで待機します。

現在のスレッドが最後に到着するスレッドではない場合、スレッドのスケジューリングについては無効とされ、以下のどれかが発生するまで待機します。

現在のスレッドで、

InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。

指定された待機時間が経過すると、TimeoutException がスローされます。時間がゼロまたはそれより小さい場合、メソッドは待機しません。

いずれかのスレッドが待機中にバリアで reset() が実行されるか、await の呼び出し時またはいずれかのスレッドが待機中にバリアが破壊された場合、BrokenBarrierException がスローされます。

待機中にいずれかのスレッドで割り込みが発生した場合、待機中の他のスレッドがすべて BrokenBarrierException をスローし、バリアが故障状態に置かれます。

現在のスレッドが到着する最後のスレッドであり、コンストラクタ内で null ではないバリアアクションが指定される場合、現在のスレッドはアクションを実行してから、他のスレッドの続行を許可します。バリアアクション中に例外が発生すると、現在のスレッド内でその例外が送信され、バリアが故障状態に置かれます。

パラメータ:
timeout - バリアを待機する時間
unit - timeout パラメータの時間単位
戻り値:
現在のスレッドの到着インデックス。インデックス getParties() - 1 は最初に到着するスレッドを、ゼロは最後に到着するスレッドを示す
例外:
InterruptedException - 待機中に、現在のスレッドで割り込みが発生した場合
TimeoutException - 指定されたタイムアウト時間が経過した場合
BrokenBarrierException - 現在のスレッドの待機中に別のスレッドで割り込みが発生した、バリアがリセットされた、await の呼び出し時にバリアが破壊された、または例外のためにバリアアクション (存在する場合) が失敗した場合

isBroken

public boolean isBroken()
このバリアが故障状態にあるかどうかを問い合わせます。

戻り値:
構築または最後のリセット以降、割り込みまたはタイムアウトのために 1 つ以上のパーティがこのバリアから破壊されたか、例外のためにバリアアクションが失敗した場合は true、そうでない場合は false

reset

public void reset()
バリアを初期状態にリセットします。いずれかのパーティがバリアで待機中の場合は、BrokenBarrierException をスローして復帰します。他の理由で切断が発生したあとにリセットする場合は、実行が複雑になる場合があります。つまり、他の何らかの方法でスレッドを再同期して、リセットを実行するスレッドを選択する必要があります。こうした状況では、以降で使用するためにバリアを新規作成する方が望ましい場合があります。


getNumberWaiting

public int getNumberWaiting()
バリアで待機しているパーティの数を返します。このメソッドは、主にデバッグおよび宣言で役立ちます。

戻り値:
await() 内で現在ブロックされているパーティの数

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。