|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.util.concurrent.CyclicBarrier
public class CyclicBarrier
スレッドセットのそれぞれが共通のバリアポイントに達するまで待機することを可能にする同期化支援機能。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) を介して異常な状態が続きます。
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 |
| コンストラクタの詳細 |
|---|
public CyclicBarrier(int parties,
Runnable barrierAction)
parties - バリアがトリップする前に await() を呼び出す必要のあるスレッドの数barrierAction - バリアのトリップ時に実行するコマンド。アクションが存在しない場合は null
IllegalArgumentException - parties が 1 未満の場合public CyclicBarrier(int parties)
parties - バリアがトリップする前に await() を呼び出す必要のあるスレッドの数
IllegalArgumentException - parties が 1 未満の場合| メソッドの詳細 |
|---|
public int getParties()
public int await()
throws InterruptedException,
BrokenBarrierException
パーティがこのバリアで await を呼び出すまで待機します。
現在のスレッドが最後に到着するスレッドではない場合、スレッドのスケジューリングについては無効とされ、次のいずれかが発生するまで待機します。
割り込みを行う 割り込みを行うreset() を呼び出す 現在のスレッドで、
割り込みが発生した場合、
InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。
いずれかのスレッドが待機中にバリアで reset() が実行されるか、await の呼び出し時またはいずれかのスレッドが待機中にバリアが破壊された場合、BrokenBarrierException がスローされます。
待機中にいずれかのスレッドで割り込みが発生した場合、待機中の他のスレッドがすべて BrokenBarrierException をスローし、バリアが故障状態に置かれます。
現在のスレッドが到着する最後のスレッドであり、コンストラクタ内で null ではないバリアアクションが指定される場合、現在のスレッドはアクションを実行してから、他のスレッドの続行を許可します。バリアアクション中に例外が発生すると、現在のスレッド内でその例外が送信され、バリアが故障状態に置かれます。
getParties() - 1 は最初に到着するスレッドを、ゼロは最後に到着するスレッドを示す
InterruptedException - 待機中に、現在のスレッドで割り込みが発生した場合
BrokenBarrierException - 現在のスレッドの待機中に別のスレッドで割り込みが発生した、バリアがリセットされた、await の呼び出し時にバリアが破壊された、または例外のためにバリアアクション (存在する場合) が失敗した場合
public int await(long timeout,
TimeUnit unit)
throws InterruptedException,
BrokenBarrierException,
TimeoutException
パーティがこのバリアで await を呼び出すまで待機します。
現在のスレッドが最後に到着するスレッドではない場合、スレッドのスケジューリングについては無効とされ、以下のどれかが発生するまで待機します。
割り込みを行う 割り込みを行うreset() を呼び出す 現在のスレッドで、
割り込みが発生した場合、
InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。
指定された待機時間が経過すると、TimeoutException がスローされます。時間がゼロまたはそれより小さい場合、メソッドは待機しません。
いずれかのスレッドが待機中にバリアで reset() が実行されるか、await の呼び出し時またはいずれかのスレッドが待機中にバリアが破壊された場合、BrokenBarrierException がスローされます。
待機中にいずれかのスレッドで割り込みが発生した場合、待機中の他のスレッドがすべて BrokenBarrierException をスローし、バリアが故障状態に置かれます。
現在のスレッドが到着する最後のスレッドであり、コンストラクタ内で null ではないバリアアクションが指定される場合、現在のスレッドはアクションを実行してから、他のスレッドの続行を許可します。バリアアクション中に例外が発生すると、現在のスレッド内でその例外が送信され、バリアが故障状態に置かれます。
timeout - バリアを待機する時間unit - timeout パラメータの時間単位
getParties() - 1 は最初に到着するスレッドを、ゼロは最後に到着するスレッドを示す
InterruptedException - 待機中に、現在のスレッドで割り込みが発生した場合
TimeoutException - 指定されたタイムアウト時間が経過した場合
BrokenBarrierException - 現在のスレッドの待機中に別のスレッドで割り込みが発生した、バリアがリセットされた、await の呼び出し時にバリアが破壊された、または例外のためにバリアアクション (存在する場合) が失敗した場合public boolean isBroken()
public void reset()
BrokenBarrierException をスローして復帰します。他の理由で切断が発生したあとにリセットする場合は、実行が複雑になる場合があります。つまり、他の何らかの方法でスレッドを再同期して、リセットを実行するスレッドを選択する必要があります。こうした状況では、以降で使用するためにバリアを新規作成する方が望ましい場合があります。
public int getNumberWaiting()
await() 内で現在ブロックされているパーティの数
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。