1

Callable で割り込みビットを設定すると、Future.get() が呼び出されたときに Callable を表す Future が TimeoutException をスローしないのはなぜですか?

public class ExecutorServiceTest extends MockitoTestCase {
  private static CountDownLatch latch1 = new CountDownLatch(1);

  class TaskChecksForInterruptedExcAndDoesSetInterruptedBit implements Callable<String> {
    @Override
    public String call() {
      latch1.countDown();
      while (!Thread.currentThread().isInterrupted()) {
      }
      Thread.currentThread().interrupt();
      return "blah";
    }
  }

  void testInterrupt() throws Exception {
    ExecutorService pool = Executors.newFixedThreadPool(numThreads);
    Future<String> future = pool.submit(new TaskChecksForInterruptedExcAndDoesSetInterruptedBit());
    latch1.await(); // Don't interrupt the Callable until it actually starts processing
    pool.shutdownNow();
    try {
      future.get(100, TimeUnit.MILLISECONDS);
    } catch (final TimeoutException e) {
      // Why doesn't this get called!
      return;
    }
    fail();
  }
}
4

1 に答える 1

1
  1. shutdownNow() 呼び出しは、実行中のすべてのタスクを中断しようとします。この場合、割り込みはビジー ループで検出されるため、コードは続行され、Callable は "blah" を返します (例外ではありません)。

  2. 仕様によると、TimeoutException は、スレッドが完全なタイムアウト期間を待機した場合にのみスローされますが、結果は利用できません。中断はこのシナリオには当てはまりません。

  3. CountDownLatch の使用法が正しくありません。あなたはそれを減らしますが、latch1.await() への呼び出しは見られません

于 2013-03-04T19:07:24.987 に答える