¿Por qué invocar el método Thread.currentThread.interrupt()
en el bloque catch?
fuente
¿Por qué invocar el método Thread.currentThread.interrupt()
en el bloque catch?
Esto se hace para mantener el estado .
Cuando lo atrapa InterruptException
y lo traga, esencialmente evita que cualquier método de nivel superior / grupo de hilos note la interrupción. Lo que puede causar problemas.
Llamando Thread.currentThread().interrupt()
, establece el indicador de interrupción del subproceso, para que los manejadores de interrupciones de nivel superior lo noten y puedan manejarlo adecuadamente.
La concurrencia de Java en la práctica analiza esto con más detalle en el Capítulo 7.1.3: Respuesta a la interrupción . Su regla es:
Solo el código que implementa la política de interrupción de un hilo puede tragarse una solicitud de interrupción. La tarea de propósito general y el código de la biblioteca nunca deben tragarse las solicitudes de interrupción.
InterruptedException
borra Alarma de estado cuando lo hace. Creo que esto hace que la respuesta más clara en cuanto a la razón por la que necesita para preservar el estado de interrupción.interrupt()
llamada es la única forma de establecer el indicador interrumpido una vez que recibió una notificación sobre este estado a través del otro "mecanismo de entrega": elInterruptedException
y desea o no puede volver a lanzarlo.Creo que este ejemplo de código aclara un poco las cosas. La clase que hace el trabajo:
La clase principal:
Intente llamar a interrupción sin volver a configurar el estado.
fuente
Nota:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
¿Cómo detengo un hilo que espera durante largos períodos (por ejemplo, para la entrada)?
Esto asegura que el subproceso volverá a subir la excepción interrumpida tan pronto como sea posible.
fuente
Lo consideraría una mala práctica o al menos un poco arriesgado. Por lo general, los métodos de nivel superior no realizan operaciones de bloqueo y nunca verán
InterruptedException
allí. Si lo enmascara en cada lugar donde realiza una operación interrumpible, nunca lo obtendrá.La única razón para
Thread.currentThread.interrupt()
no generar ninguna otra excepción o solicitud de interrupción de señalización de ninguna otra manera (por ejemplo, establecerinterrupted
la variable de variable local en el bucle principal de un hilo) es la situación en la que realmente no puede hacer nada con la excepción, como en losfinally
bloques.Vea la respuesta de Péter Török, si desea comprender mejor las implicaciones de la
Thread.currentThread.interrupt()
llamada.fuente
Referir de java doc
Por lo tanto, si cambia el método sleepBabySleep () en @Ajay George Answer a la operación de E / S o simplemente un sysout, no tiene que volver a configurar el estado para detener el programa. (Por cierto, ni siquiera lanzan InterruptedException)
Al igual que @ Péter Török dijo => Esto se hace para mantener el estado. (Y en particular para el método que arrojará InterruptedException)
fuente