Luego de consultar especialistas en la materia, programadores de varias ramas y profesores dimos con la solución al dilema y la compartimos en esta publicación.
Solución:
Thread.interrupt()
establece el estado / bandera de interrupción del hilo de destino. Luego, el código que se ejecuta en ese hilo de destino PUEDE sondear el estado interrumpido y manejarlo adecuadamente. Algunos métodos que bloquean como Object.wait()
puede consumir el estado interrumpido inmediatamente y lanzar una excepción apropiada (generalmente InterruptedException
)
La interrupción en Java no es preventiva. Dicho de otra manera, ambos subprocesos deben cooperar para procesar la interrupción correctamente. Si el hilo de destino no sondea el estado interrumpido, la interrupción se ignora efectivamente.
El sondeo se realiza a través del Thread.interrupted()
método que devuelve el estado interrumpido del hilo actual Y borra ese indicador de interrupción. Por lo general, el hilo podría hacer algo como lanzar InterruptedException.
EDITAR (de los comentarios de Thilo): algunos métodos API han incorporado el manejo de interrupciones. De la parte superior de mi cabeza esto incluye.
Object.wait()
,Thread.sleep()
, yThread.join()
- Más
java.util.concurrent
estructuras - Java NIO (pero no java.io) y NO usa
InterruptedException
, en lugar de usarClosedByInterruptException
.
EDITAR (de la respuesta de @ thomas-pornin a exactamente la misma pregunta para completar)
La interrupción del hilo es una forma suave de empujar un hilo. Se utiliza para dar a los hilos la oportunidad de salir. limpiamente, Opuesto a Thread.stop()
eso es más como disparar el hilo con un rifle de asalto.
¿Qué es interrumpir?
Una interrupción es una indicación para un hilo de que debe detener lo que está haciendo y hacer otra cosa. Depende del programador decidir exactamente cómo responde un hilo a una interrupción, pero es muy común que el hilo termine.
¿Cómo se implementa?
El mecanismo de interrupción se implementa mediante un indicador interno conocido como estado de interrupción. Invocar Thread.interrupt establece esta bandera. Cuando un hilo busca una interrupción invocando el static método Thread.interrupted, el estado de interrupción se borra. El nostatic
Thread.isInterrupted, que es utilizado por un hilo para consultar el estado de interrupción de otro, no cambia el indicador de estado de interrupción.
Cita de Thread.interrupt()
API:
Interrumpe este hilo. Primero se invoca el método checkAccess de este hilo, lo que puede provocar que se lance una SecurityException.
Si este hilo está bloqueado en una invocación de los métodos wait (), wait (long) o wait (long, int) de la clase Object, o de los métodos join (), join (long), join (long, int) , sleep (long) o sleep (long, int), métodos de esta clase, entonces su estado de interrupción se borrará y recibirá una InterruptedException.
Si este hilo está bloqueado en una operación de E / S en un canal interrumpible, el canal se cerrará, se establecerá el estado de interrupción del hilo y el hilo recibirá una excepción ClosedByInterruptException.
Si este hilo está bloqueado en un Selector, entonces se establecerá el estado de interrupción del hilo y regresará inmediatamente de la operación de selección, posiblemente con un valor distinto de cero, como si se hubiera invocado el método de activación del selector.
Si no se cumple ninguna de las condiciones anteriores, se establecerá el estado de interrupción de este hilo.
Consulte esto para obtener una comprensión completa sobre lo mismo:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
Si el hilo de destino ha estado esperando (llamando wait()
, o algunos otros métodos relacionados que esencialmente hacen lo mismo, como sleep()
), se interrumpirá, lo que significa que dejará de esperar lo que estaba esperando y recibirá una InterruptedException en su lugar.
Depende completamente del hilo en sí (el código que llamó wait()
) para decidir qué hacer en esta situación. No finaliza automáticamente el hilo.
A veces se usa en combinación con una bandera de terminación. Cuando se interrumpe, el subproceso puede verificar esta bandera y luego apagarse. Pero nuevamente, esto es solo una convención.
Más adelante puedes encontrar las notas de otros usuarios, tú asimismo eres capaz insertar el tuyo si lo deseas.