3

さて、while() ループを実行するスレッドがあるとしましょう。ループ中に、何かを実行してからスリープに戻ることができます。

public void run() {
    while (some_condition) {
        doSomeLongJob();      // this could be a long job
        try {
            Thread.sleep(a_bit);    // back to sleep
        } catch (InterruptedException ie) {
            handleInterruptionButDoNotExitLoop();
        }
    }
}

いくつかの質問:

  1. doSomeLongJobの実行中に中断が発生した場合、メソッドは自然な終了まで続行しますか? (誰もThread.interrupted()をチェックしない限り、はい、と思いますが、確認したいと思います);
  2. 割り込みをキャッチした後、interrupted()ステータスは false にリセットされますか?
  3. 結論として、スレッドのステータスがリセットされている限り、スレッドをn回中断できますか? doSomeLongJobの実行中の割り込みを処理するために、スレッドのステータスを手動でリセットする方法はありますか?
4

3 に答える 3

1
  1. おそらく、doSomeLongJob開いているInterruptibleChannelIO オブジェクトがClosedByInterruptExceptionある場合、スレッドの割り込み状態がクリアされていない場合、次にそれらにアクセスしようとすると、それらがスローされます。

  2. InterruptedExceptionJava コア クラスによってスローされると、スレッドの割り込み状態が設定されない

  3. Thread.interrupted割り込み状態をクリアします。割り込みのテストだけが必要な場合Thread.isInterruptedは、ステータスが表示され、割り込み状態が保持されます。

于 2013-04-05T10:50:46.850 に答える
1

質問に答えるには:

  1. 中断と言うのは、InterruptedException のことですか? もしそうなら、可能性のある例外を処理するためにdoSomeLongJobを try 内に移動する必要があると思います。

  2. false にリセットされることはありません。手動で行う必要があります。

  3. 中断状態をリセットするには、 Thread.interrupted() を呼び出してください。

于 2013-04-05T10:53:36.540 に答える