4

スレッドの中断について明確にしたい。

スレッドが、InterruptedException をスローするメソッドを呼び出さずに長時間経過するとどうなりますか? 次に、定期的に Thread.interrupted を呼び出す必要があります。これは、割り込みが受信された場合に true を返します。例えば:

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We've been interrupted: no more crunching.
        return;
    }
}

メソッドを呼び出すと、Thread.interrupt()中断された例外がスローされるため、なぜそれを行う必要があるのか​​ 、if (Thread.interrupted())単にそれを行うだけです

try {
    for (int i = 0; i < inputs.length; i++) {
        heavyCrunch(inputs[i]);
        if (Thread.interrupted()) {
            // We've been interrupted: no more crunching.
            return;
        }
    }
} catch (InterruptedException ex) {
        ...
}
4

3 に答える 3

4

別のスレッドを呼び出すとThread.interrupt()、次の 2 つのことが起こります。

  1. そのスレッドの割り込みフラグが設定されます。
  2. スレッドがメソッドでブロックされている場合throws InterruptedException、そのメソッドはすぐに例外をスローします。

をスローしないコードでスレッドがビジーである場合、InterruptedException例外は発生しません。if (Thread.interrupted())そのため、フラグを確認するには、check が必要です。

あなたのサンプル コードでは、Java コンパイラはブロック内のどのコードも をスローcatchしないため、無効なブロックについて不平を言います。tryInterruptedException

于 2014-03-12T15:27:56.027 に答える
0

文書化されているようThread.interrupted()に、まったくスローしないためです。true または false を返し、 への呼び出しによって設定された割り込みステータスをクリアします。どちらもスローされないことに注意してください。単に割り込みステータスを設定します。InterruptedExceptionThread.interrupt()Thread.interrupt()InterruptedException

于 2014-03-12T15:27:25.953 に答える