Thread.join() の前に Thread.interrupt() を呼び出すと、join() はすぐに InterruptedException をスローしますか?
いいえ、投げません。メソッドを呼び出している現在のjoin()
スレッドが中断された場合にのみ、がjoin()
スローされInterruptedException
ます。 t.interrupt()
開始したばかりのスレッドを中断していますが、結合を実行しているスレッド(おそらくメインスレッド?)自体が中断された場合t.join()
にのみスローされます。InterruptedException
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); // will _not_ throw unless this thread calling join gets interrupted
また、スレッドを中断してもキャンセルされず、スレッドがスローした例外が返されるという点でと join()
は異なることを認識することも重要です。Future
スレッドを中断すると、スレッドがsleep()
、wait()
、join()
、およびその他の中断可能なメソッドに対して行っているすべての呼び出しが をスローしInterruptedException
ます。これらのメソッドが呼び出されない場合、スレッドは引き続き実行されます。スレッドがInterruptedException
割り込みに応答して をスローしてから終了した場合、 を使用しない限り、その例外は失われますt.setDefaultUncaughtExceptionHandler(handler)
。
あなたの場合、スレッドが中断されて終了した場合、結合は終了します-例外はスローされません。割り込みを適切に処理するための一般的なスレッド コードは次のとおりです。
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// a good pattern is to re-interrupt the thread when you catch
Thread.currentThread().interrupt();
// another good pattern is to make sure that if you _are_ interrupted,
// that you stop the thread
return;
}
}