¿Podría explicar qué java.lang.Thread.interrupt()
hace cuando se invoca?
java
multithreading
oneat
fuente
fuente
Respuestas:
Thread.interrupt()
establece el estado / indicador interrumpido del hilo objetivo. Luego, el código que se ejecuta en ese hilo de destino PUEDE sondear el estado interrumpido y manejarlo adecuadamente. Algunos métodos que bloqueanObject.wait()
pueden consumir el estado interrumpido inmediatamente y generar una excepción apropiada (generalmenteInterruptedException
)La interrupción en Java no es preventiva. Dicho de otro modo, ambos hilos deben cooperar para procesar la interrupción correctamente. Si el hilo objetivo 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 subproceso 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()
java.util.concurrent
estructurasInterruptedException
, sino que usaClosedByInterruptException
.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 usa para dar a los hilos la oportunidad de salir limpiamente , en lugar de
Thread.stop()
eso es más como disparar el hilo con un rifle de asalto.fuente
¿Qué es la interrupción?
¿Cómo se implementa?
Cita de
Thread.interrupt()
API :Mira esto para comprender completamente lo mismo:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
fuente
Si el hilo objetivo ha estado esperando (llamando
wait()
, o algún otro método relacionado que esencialmente haga lo mismo, comosleep()
), se interrumpirá, lo que significa que deja de esperar lo que estaba esperando y en su lugar recibe una InterruptedException.Depende completamente del hilo (el código que llamó
wait()
) decidir qué hacer en esta situación. No termina automáticamente el hilo.A veces se usa en combinación con una bandera de terminación. Cuando se interrumpe, el hilo puede verificar esta bandera y luego cerrarse. Pero de nuevo, esto es solo una convención.
fuente
Para completar, además de las otras respuestas, si el hilo se interrumpe antes de bloques en
Object.wait(..)
oThread.sleep(..)
etc., esto es equivalente a que ser interrumpido inmediatamente después de bloqueo en ese método , como muestra el siguiente ejemplo.Salida:
Implicación: si realiza un bucle como el siguiente, y la interrupción ocurre en el momento exacto en que el control se ha ido
Thread.sleep(..)
y está dando la vuelta al bucle, la excepción seguirá ocurriendo. Por lo tanto, es perfectamente seguro confiar en que la excepción InterruptedException sea lanzada de manera confiable después de que el hilo haya sido interrumpido :fuente
Thread.interrupt()
establece el estado / indicador interrumpido del subproceso de destino en verdadero, que cuando se marca conThread.interrupted()
ayuda puede ayudar a detener el subproceso sin fin. Consulte http://www.yegor256.com/2015/10/20/interrupted-exception.htmlfuente
La interrupción de subprocesos se basa en el estado de interrupción del indicador . Para cada subproceso, el valor predeterminado del estado de interrupción se establece en falso . Cada vez que se llama al método interrupt () en el hilo, el estado de interrupción se establece en verdadero .
fuente
interrupción pública nula ()
Interrumpe este hilo.
A menos que el subproceso actual se interrumpa, lo que siempre está permitido, se invoca el método checkAccess de este subproceso, lo que puede provocar una excepción 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 join (), join (long), join (long, int) , sleep (long) o sleep (long, int), métodos de esta clase, luego se borrará su estado de interrupción y recibirá una excepción interrumpida.
Si este hilo se bloquea en una operación de E / S en un canal interrumpible, entonces el canal se cerrará, se establecerá el estado de interrupción del hilo y el hilo recibirá una ClosedByInterruptException.
Si este subproceso está bloqueado en un selector, se establecerá el estado de interrupción del subproceso y volverá inmediatamente de la operación de selección, posiblemente con un valor distinto de cero, como si se invocara el método de activación del selector.
Si ninguna de las condiciones anteriores se cumple, se establecerá el estado de interrupción de este hilo.
Interrumpir un hilo que no está vivo no necesita tener ningún efecto.
Throws: SecurityException - si el hilo actual no puede modificar este hilo
fuente
Una interrupción es una indicación a 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. Una muy buena referencia: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
fuente
El método Thread.interrupt () establece el indicador interno de "estado de interrupción". Por lo general, ese indicador se verifica mediante el método Thread.interrupted ().
Por convención, cualquier método que exista a través de InterruptedException debe borrar el indicador de estado de interrupción.
fuente