11

基本的には、質問のタイトルには何がありますか。Thread.join()の前にThread.interrupt()を呼び出すと、join()はすぐにInterruptedExceptionをスローしますか?

私の独自のテストから、確かに確信していただけです。私はThread.join()が "待機"ルーチンを実行する前にスレッドのinterruptedステータスをチェックしていると推測していますか?

+2

いいえ、Thread.join()は、*現在のスレッドへの割り込みのみに関係しています。 – EJP

答えて

14

interrupt()は、割り込みを行っているスレッドではなく、中断したスレッドに割り込みを行います。

c.f.

Thread.currentThread().interrupt(); 
t.join(); // will throw InterruptedException 
14

は、直ちに例外: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; 
    } 
} 
関連する問題