ブロックされていない間に中断された (つまり、InterruptedException がスローされなかった) スレッドが与えられた場合、そのスレッドは後でスリープしようとしたときに InterruptedException をスローしますか?
ドキュメントには、これが明確に記載されていません。
InterruptedException - いずれかのスレッドが現在のスレッドを中断した場合。この例外がスローされると、現在のスレッドの中断ステータスがクリアされます。
ブロックされていない間に中断された (つまり、InterruptedException がスローされなかった) スレッドが与えられた場合、そのスレッドは後でスリープしようとしたときに InterruptedException をスローしますか?
ドキュメントには、これが明確に記載されていません。
InterruptedException - いずれかのスレッドが現在のスレッドを中断した場合。この例外がスローされると、現在のスレッドの中断ステータスがクリアされます。
これが必須であることを示すドキュメントは見つかりませんでしたが、私のシステム (32 ビット クライアント VM 1.7) では、中断されたフラットが設定されているときにスリープしようとするとスローされることがわかりました。テストコード:
static volatile boolean ready = false;
public static void main (final String... args) throws InterruptedException {
Thread t = new Thread () {
public void run () {
while (!ready) {
}
try {
Thread.sleep (1);
System.out.println ("Not thrown!");
}
catch (InterruptedException e) {
System.out.println ("Thrown!");
}
}
};
t.start ();
t.interrupt (); // remove this line to change the output
ready = true;
Thread.sleep (100);
}
いいえ。
ドキュメントには、「このスレッドがObject クラスのwait()、wait(long)、またはwait(long, int)メソッド、またはjoin()、join( long)、join(long, int)、sleep(long)、またはsleep(long, int)、このクラスのメソッドを使用すると、その割り込みステータスがクリアされ、InterruptedException を受け取ります。」
それはあなたが言及したケースを除外します。