5

を使用しCountDownLatchて 2 つの Java スレッドを処理しています。私のクラス構造は次のとおりです。

MainClass.java
ThreadOne.java
ThreadTwo.java

メインクラス:

CountDownLatch latch = new CountDownLatch(2);           
Thread thread = new Thread(new ThreadOne(latch));
thread.start();

Thread thread1 = new Thread(new ThreadTwo(latch));
thread1.start();        

latch.await(20, TimeUnit.SECONDS);

メイン クラスは、他の 2 つのスレッドが作業を完了するまで待機します。作業が完了するとすぐに、タイムアウト値 (20 秒) まで待機しません。私の問題は、スレッドのいずれかが破壊または破損した場合CountDownLatch、タイムアウト値を待つことです。その中断されたスレッドを無視して、20 秒待たずに先に進む方法はありますか?

4

2 に答える 2

7

zaplは絶対に正しいです!メインスレッドは、タイムアウトが終了するのを待っています。メイン スレッドがラッチで待機している間にスレッド ダンプを取得すると、次のように表示されます。

"main" #1 prio=5 os_prio=31 tid=0x00007fa4be002000 nid=0x1303 waiting on condition [0x000000010b74c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x000000076abcb598> (a java.util.concurrent.CountDownLatch$Sync)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)

の Javadoc からawait:

現在のカウントが 0 より大きい場合、現在のスレッドはスレッド スケジューリングの目的で無効になり、次の 3 つのいずれかが発生するまで休止状態になります。

  1. countDown メソッドの呼び出しにより、カウントがゼロになります。また
  2. 他のスレッドが現在のスレッドに割り込みます。また
  3. 指定された待ち時間が経過します。

あなたの場合、await呼び出しは 3) のためにのみ返されます。

CountDownLatchJavadoc では、メソッドの呼び出しはブロックcountDown()内で行われているはずです。finally

public void run() {
    try {
        startSignal.await();
        doWork(); // may throw exception
    } catch (InterruptedException ex) {
        // handle interruption ...
    } finally {
        doneSignal.countDown(); // cause await to return asap
    }
}
于 2016-05-18T12:29:52.770 に答える
0

スレッドが破棄されたときに何らかの通知が必要です。InterruptedExceptionこれを行う 1 つの方法は、スレッド内で手動でキャッチし、エラーをカウントダウンすることです。

別の方法は、Runnable代わりにタスクをThreads使用し、グアバListenableFutureを使用してエラー通知を取得することです。このSO Q&A はそれをよく説明しています。

于 2016-05-18T12:30:22.787 に答える