java - samsung - Interrumpir hilo: ¿cancelará la llamada en espera() que se aproxima?
llamada en espera huawei p9 lite (2)
Lea las especificaciones de API para Thread.interrupt()
-
Interrumpe este hilo.
A menos que el hilo actual se esté interrumpiendo, lo que siempre está permitido, se invoca el método checkAccess de este hilo, que puede provocar que se genere 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 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 interruptedException.
Si este subproceso se bloquea en una operación de E / S sobre un canal interrumpible, el canal se cerrará, se establecerá el estado de interrupción del subproceso y el subproceso recibirá una excepción ClosedByInterruptException.
Si este hilo está bloqueado en un Selector, se establecerá el estado de interrupción del hilo y éste retornará inmediatamente desde 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 no se cumple ninguna de las condiciones anteriores, se establecerá el estado de interrupción de este subproceso.
La interrupción de un hilo que no está vivo no tiene por qué tener ningún efecto.
Entonces, todo lo que sucederá será el estado de interrupción del hilo.
EDITAR
Si lee las especificaciones API para Object.wait()
, verá lo siguiente:
Lanza:
InterruptedException: si un hilo ha interrumpido el hilo actual antes o mientras el hilo actual estaba esperando una notificación . El estado interrumpido del hilo actual se borra cuando se lanza esta excepción.
Tengo un hilo que tiene una cola de trabajos entrante (una LinkedList
contiene descripciones de trabajo). El hilo bloquea con wait()
en la cola cuando no hay trabajo para trabajar. Un objeto del asignador de trabajo externo lo despierta con notify()
cuando coloca nuevos trabajos en la cola.
En el cierre de mi programa llamo a interrupt()
en el hilo. Esto aumenta la InterruptedException
cuando el subproceso espera trabajos en wait()
. Mi pregunta es: ¿qué pasará si interrumpo el hilo mientras no está bloqueando pero haciendo algún tipo de trabajo, el elemento procesado fue el último en la cola (por lo que la cola está ahora vacía) y la ejecución isInterrupted()
la isInterrupted()
antes de la interrupción la bandera se establece para que vuelva a llamar a wait()
? ¿Lanzará una InterruptedException
porque la bandera interrumpida ya se ha configurado o el hilo espera para siempre porque los nuevos trabajos nunca llegarán a la cola y no hay nadie que interrumpa la espera?
sí, su hilo interrumpido arrojará una excepción interrumpida al llamar a wait (). esto es bastante simple de probar por ti mismo.
public class TestInt {
public static void main(String[] args) throws Exception
{
Thread.currentThread().interrupt();
synchronized(TestInt.class) {
TestInt.class.wait();
}
}
}
también, tenga en cuenta el javaodc para Object.wait()
:
InterruptedException: si un hilo ha interrumpido el hilo actual antes o mientras el hilo actual estaba esperando una notificación. El estado interrumpido del hilo actual se borra cuando se lanza esta excepción.