基本的には、質問のタイトルには何がありますか。Thread.join()の前にThread.interrupt()を呼び出すと、join()はすぐにInterruptedExceptionをスローしますか?
私の独自のテストから、確かに確信していただけです。私はThread.join()
が "待機"ルーチンを実行する前にスレッドのinterrupted
ステータスをチェックしていると推測していますか?
基本的には、質問のタイトルには何がありますか。Thread.join()の前にThread.interrupt()を呼び出すと、join()はすぐにInterruptedExceptionをスローしますか?
私の独自のテストから、確かに確信していただけです。私はThread.join()
が "待機"ルーチンを実行する前にスレッドのinterrupted
ステータスをチェックしていると推測していますか?
interrupt()
は、割り込みを行っているスレッドではなく、中断したスレッドに割り込みを行います。
c.f.
Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException
は、直ちに例外:InterruptedExceptionをスローするように参加する()を引き起こす)(Thread.join前Thread.interrupt()を呼び出していますか?
いいえ、それは投げられません。 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;
}
}
いいえ、Thread.join()は、*現在のスレッドへの割り込みのみに関係しています。 – EJP