最初のいくつかの説明:スレッドの
割り込みステータスは、基本的にinterrupt()
によって「真」に設定されているブールフラグです。 このフラグの現在の状態はとなります。はThread.currentThread().isInterrupted()
です。
割り込み操作(のようなObject.wait()
またはThread.sleep()
)は、中断フラグが を設定し、それが(「偽」に設定されている)、このようになりますフラグ、InterruptedException
と同時に明確をスローします発見した場合:
を
if (Thread.interrupted()) { throw new InterruptedException(); }
Thread.interrupted()
は、中断されたフラグを暗黙的にクリアすることに注意してください。 これは、catch(InterruptedException ie) {...}
が実行されるまでに、 スレッド自体がそれが中断されたことを知らないことを意味します。
まずキャンセルをサポートするタスクの例:の2つの例を見てみましょう、と述べた
。ここで 、私たちは本当にどこまで作業が進行中止される前に気にしない:このコードは=それが中断されていない場合、それが完了しますと、出力の」x 0から10までのxをカウントしようとし
public void run() {
int x = 0;
try {
while (x < 10) {
Thread.sleep(1000); // Some interruptible operation
x++;
}
System.out.println("x = " + x);
} catch (InterruptedException ie) {
System.out.println("Interrupted: x = " + x);
// We know we've been interrupted.
// Let the caller know it, too:
Thread.currentThread().interrupt();
}
}
10 "となる。 しかし、スレッドが中間で中断された場合は、InterruptedException
がスローされ、xをインクリメントする処理が中断されます。 この場合、出力は、スレッドが中断されたときに応じて、「中断:x = 0」から「中断:x = 9」のいずれかになることがあります。
以降に終了する前にスレッドの割り込みフラグを復元することをお勧めします。そうしないと、中断されたステータスはこのrun()
メソッドの呼び出し元には表示されません。
public void run() {
int x = 0;
boolean wasInterrupted = false; // <- This is the local variable to store the interruption status
while (x < 10) {
wasInterrupted = wasInterrupted || Thread.interrupted(); // not really needed in this case, but for the sake of completeness...
try {
Thread.sleep(1000); // <- Some interruptible operation
} catch (InterruptedException e) {
wasInterrupted = true;
}
x++;
}
System.out.println("x = " + x);
if (wasInterrupted) {
Thread.currentThread().interrupt();
}
}
:それは、出力は常にキャンセルをサポートしていないタスクを意味し、「X = 10」、になるように私たちのタスクは、完全な形で実行することが重要である場合
は今、私たちは別のアプローチが必要
この場合、タスクが完了するまでInterruptedException
の後でも処理を続行します。 割り込みを検出すると、その状態をwasInterrupted
に保存して、 がメソッドから戻る前に割り込みフラグを正しく設定できるようにします。ローカルに中断状態を保存し、ちょうど返す前にそれを復元する必要があり
が何を意味するかだ
。
それは言う私たちは厳密に中断をこのように処理するために必要とされていないので、「すべきである」 - 私たちは同様にただのInterruptedException
を無視し、私たちのタスクを完了することがあり、その後、戻ります。ただし、これは上記の優れた方法ではなく、一部のシナリオで問題を引き起こす可能性があります。
合理的な説明があります:http://stackoverflow.com/questions/7751690/noncancelable-task-that-restores-interruption-before-exit – Cole