11

Básicamente, lo que dice el título de la pregunta.¿Llamar a Thread.interrupt() antes de un Thread.join() hace que join() arroje una InterruptedException inmediatamente?

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

De mis propias pruebas, parece, pero solo quería estar seguro. Supongo que Thread.join() comprueba el estado interrupted del hilo antes de hacer su rutina de "espera".

+2

No, Thread.join() sólo se refiere a las interrupciones en la corriente * * hilo. – EJP

Respuesta

14

interrupt() interrumpe el hilo que interrumpió, no el hilo que realiza la interrupción.

c.f.

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

¿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; 
    } 
} 
Cuestiones relacionadas