2

明示的にリリースする方法はありますかCountDownLatch- do なしを意味しますcountDown()

例: 100 個のスレッドが実行されるのを待っているとしますcountDown()が、何かが失敗した場合、これ以上待たずにこのラッチを解放したいとします。getCount()ラッチをオンにしてからサイクルを実行することを考えていましcountDown()たが、最適な方法ではありません。

提案/アイデアはありますか?

4

5 に答える 5

1

タイムアウトで待機を使用しないのはなぜですか?

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 は完了またはタスクの失敗後に終了します。

等々...

于 2014-11-20T08:37:16.910 に答える
0

他の回答に加えて:

「しかし、何かが失敗した場合」が何を意味するかによって異なりますが、失敗がワーカースレッドで例外をキャッチすることを意味する場合は、catch 句内のラッチもカウントダウンできます。もちろん、これによりcountDownの意味が「正常に処理されました」から「処理が完了しました」に変わります-したがって、コードでこれを処理する必要があります..

于 2014-11-20T09:03:50.700 に答える