11

効果的なJava(275ページ)には、次のコードセグメントがあります。

...
for (int i = 0; i < concurrency; i++) {
  executor.execute(new Runnable() {
    public void run() {
    ready.countDown();
    try {
      start.await();
      action.run();
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    } finally {
      done.countDown();
    }
  }
}
...

中断された例外をキャッチして、それを再発生させるための使用は何ですか?飛ばしてみませんか?

4

3 に答える 3

15

簡単な答えはInterruptedException、チェックされた例外であり、Runnable.runメソッド(またはExecutable.execute()メソッド)のシグネチャにはないということです。だからあなたはそれを捕まえる必要があります。そして、それを捕まえたらThread.interrupt()、割り込みフラグを設定するために呼び出すことをお勧めします...本当に割り込みを潰すつもりがない限り。

于 2009-12-13T08:16:05.403 に答える
0

例外を無視できない場合があり、それをキャッチする必要があります。InterruptedExceptionこれは主に、シグネチャに従ってスローできないメソッドをオーバーライドするときに発生します。たとえば、このアプローチは通常、Runnable.run()メソッドで使用されます。

于 2009-12-13T08:20:22.497 に答える
0

エグゼキュータは、タスクがキャンセルされた場合にタスクを中断できますが、タスク間の中断フラグをクリアして、キャンセルされた1つのタスクが無関係のタスクを中断しないようにします。

そのため、ここで現在のスレッドを中断すると、実際に何かが行われた場合に危険になります。

これを回避する簡単な方法は、Callableを使用するか、割り込みを無視することです。

さらに、try / catchブロックでスローされたエラーまたは例外をキャッチしてログに記録することをお勧めします。そうしないと、例外/エラーが破棄され、プログラムが失敗する可能性がありますが、それが原因であるかどうかはわかりません。

于 2009-12-13T15:26:04.490 に答える