¿Se llama Thread.interrupt() antes de que un Thread.join() causa la unión() para lanzar una InterruptedException de inmediato?
No it will throw. Solo si el hilo actual que llama al método join()
se interrumpe, join()
arroja InterruptedException
. t.interrupt()
está interrumpiendo el hilo que acaba de iniciar, mientras que t.join()
solo lanzará InterruptedException
si el hilo que está haciendo la unión (¿quizás el hilo principal?) Se interrumpe.
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); // will _not_ throw unless this thread calling join gets interrupted
También es importante darse cuenta de que la interrupción de un hilo no cancela que y join()
no es como un Future
en que le proporcione la excepción tiró del hilo.
Cuando se interrumpe un hilo, una llamada el hilo está realizando para sleep()
, wait()
, join()
, y otros métodos interrumpibles tirarán InterruptedException
. Si no se invocan esos métodos, el hilo continuará ejecutándose. Si un hilo hace lanza un InterruptedException
en respuesta a la interrupción y luego se cierra, esa excepción se perderá a menos que haya usado t.setDefaultUncaughtExceptionHandler(handler)
.
En su caso, si el hilo se interrumpe y finaliza porque regresa, la unión finalizará, no emitirá una excepción. código de hilo conductor para manejar una interrupción adecuada es la siguiente:
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;
}
}
No, Thread.join() sólo se refiere a las interrupciones en la corriente * * hilo. – EJP