14

基本的に、質問のタイトルが言うこと。

Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?

私自身のテストからはそう思われますが、確かにしたかっただけです。「待機」ルーチンを実行する前に、スレッドThread.join()のステータスをチェックしていると思いますか?interrupted

4

3 に答える 3

23

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;
    }
 }
于 2012-05-17T11:38:02.973 に答える
19

interrupt()中断しているスレッドではなく、中断したスレッドを中断します。

cf

Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException 
于 2012-05-17T08:52:19.480 に答える