明示的にリリースする方法はありますかCountDownLatch
- do なしを意味しますcountDown()
。
例: 100 個のスレッドが実行されるのを待っているとしますcountDown()
が、何かが失敗した場合、これ以上待たずにこのラッチを解放したいとします。getCount()
ラッチをオンにしてからサイクルを実行することを考えていましcountDown()
たが、最適な方法ではありません。
提案/アイデアはありますか?
明示的にリリースする方法はありますかCountDownLatch
- do なしを意味しますcountDown()
。
例: 100 個のスレッドが実行されるのを待っているとしますcountDown()
が、何かが失敗した場合、これ以上待たずにこのラッチを解放したいとします。getCount()
ラッチをオンにしてからサイクルを実行することを考えていましcountDown()
たが、最適な方法ではありません。
提案/アイデアはありますか?
タイムアウトで待機を使用しないのはなぜですか?
boolean await(long timeout, TimeUnit unit);
指定された待ち時間が経過した場合、値 false が返されます。それ以外の場合は、待機完了時に true が返されます。
タイムアウト後に countDownLatch.await() を中止する
他のスレッドの実行を停止したい場合、いずれかのスレッドが失敗した場合、追加の通信レイヤーが必要になります。
例えば:
AtomicBoolean kill = new AtomicBoolean(false);
CountDownLatch latch = new CountDownLatch(SOME_NUM);
class Task extends Runnable {
public void run() {
try {
....
if (kill.get())
throw new Exception();
....
} catch (Throwable throwable) {
kill.set(true);
} finally {
countDownLatch.countDown();
}
}
}
他のプロセスに関係なく、Throwable でカウントダウンを解放したいだけの場合は、例外のループで countDown を実行できます。
class Task extends Runnable {
public void run() {
try {
....
} catch (Throwable throwable) {
while(countDownLatch.getCount() != 0)
countDownLatch.countDown();
} finally {
countDownLatch.countDown();
}
}
}
2 つの countDown タスクを組み合わせることができます
CountDownLatch A = new CountDownLatch(1);
CountDownLatch B = new CountDownLatch(1);
class CountDownTracker extend Runnable {
public void run() {
B.await();
A.countDown();
}
}
class Task extends Runnable {
public void run() {
try {
....
} catch (Throwable throwable) {
A.countDown();
} finally {
B.countDown();
}
}
}
この場合、A は完了またはタスクの失敗後に終了します。
等々...
他の回答に加えて:
「しかし、何かが失敗した場合」が何を意味するかによって異なりますが、失敗がワーカースレッドで例外をキャッチすることを意味する場合は、catch 句内のラッチもカウントダウンできます。もちろん、これによりcountDownの意味が「正常に処理されました」から「処理が完了しました」に変わります-したがって、コードでこれを処理する必要があります..