0

そのため、このリソース ( http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html ) は、スレッドが割り込み自体を処理しない場合にスレッドに割り込みビットを設定することを提案しています。コール スタックの上位にあるコードが割り込みを認識し、必要に応じて応答できるようにします。」

別のスレッドで何かを実行するために ExecutorService を使用しているとしましょう。Callable を作成し、この Callable を ExecutorService.submit() に渡します。ExecutorService.submit() は Future を返します。Callable が中断されてから割り込みビットをリセットした場合、関連する Future は、Future.get() が呼び出されたときに InterruptedException をスローしません。したがって、メイン スレッドが生成されたスレッドにアクセスできる唯一の方法がこの Future である場合、Callable で中断されたビットを設定する目的は何でしょうか。

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

 ExecutorService pool = makeService();
 Future<String> future = pool.submit(new MyCallable());
 // Callable gets interrupted and the Callable resets the interrupt bit.
 future.get(); // Does not thrown an InterruptedException, so how will I ever know that the Callable was interrupted?
4

2 に答える 2

1

このシナリオでは、割り込みフラグが 2 つのスレッド間で渡されないことは正しいです (これは、組み込みの ExecutorService が何らかの理由で設計された方法です)。メイン スレッドに callable の中断ステータスを表示させたい場合は、call メソッドから InterruptedException をスローする必要があります。

class MyCallable implements Callable<String> {
  @Override
  public String call() {
    // ...
    if(Thread.currentThread().isInterrupted()) {
      throw new InterruptedException();
    }
    return "blah";
  }
}

Future.get()このシナリオから直接 InterruptedException を取得することはできないことに注意してください。これは callable によってスローされたため、 でラップされますExecutionException(これは、callable の割り込みとメイン スレッドの割り込みを区別できるようにするためです)。

于 2013-03-04T19:47:01.153 に答える
0

スレッドを中断すると、スレッドは終了するはずですが、よりも脆弱ではありませんkill()。スレッドの中断状態は、さまざまなブロッキング操作中にのみチェックされます。

これらの操作のいずれかでスレッドが中断された場合、InterruptedExceptionがスローされます。このような場合は、できるだけ早くきれいに終了する必要があります。では、Callableエグゼキュータ サービス スレッドが中断された場合はどうすればよいでしょうか。

そのアクションが短い場合、1 つの有効なオプションは、そのアクションを正常に完了することですが、このアクションの完了後にエグゼキュータ サービスがシャットダウンするように、スレッドに中断状態を設定することです。

アクションが長い場合は、代わりに、アクションが中断されたことを呼び出し元に伝える例外をスローすることができます。

于 2013-03-04T20:30:51.107 に答える