método de interrupción
Interrumpir literalmente significa interrupción, pero en Java el método Thread.interrupt() en realidad notifica al hilo de alguna manera y no lo termina directamente. Depende de la persona que escribió el código decidir qué hacer y, por lo general, abortamos el hilo.
Si el hilo llama al método wait(), wait(long) o wait(long, int) de la clase Object, o join(), join(long), join(long, int), sleep(long) o El modo de suspensión de la clase (long, int) se bloquea durante el método, su estado de interrupción se borrará y también recibirá una InterruptedException.
Si el subproceso se bloquea en una operación de E/S en un canal interrumpible (java.nio.channels.InterruptibleChannel), el canal se cerrará, se establecerá el estado de interrupción del subproceso y el subproceso recibirá una excepción ClosedByInterruptException.
Si el hilo está bloqueado en un Selector (java.nio.channels.Selector), el estado de interrupción del hilo se establecerá y regresará inmediatamente de la operación de selección, posiblemente con un valor distinto de cero, como si se llamara a select El despertar El método del dispositivo es el mismo.
Si no se ha guardado ninguna de las condiciones anteriores, se establecerá el estado de interrupción del hilo.
Interrumpir un hilo inactivo no tiene ningún efecto.
detectar interrupción
La forma en que se detecta la interrupción depende de lo que esté haciendo el hilo.
Si el hilo llama a un método que puede lanzar InterruptException, capture la InterruptException y luego manéjela en el bloque catch (generalmente saliendo del método de ejecución para interrumpir el hilo).
Si llama a otros métodos, puede verificar Thread.interrupted cuando está inactivo para determinar si se recibe una señal de interrupción y procesarlo después de confirmar que se recibe la señal de interrupción. Se puede lanzar una InterruptException para que sea coherente con el método de manejo anterior.
estado de interrupción
El mecanismo de interrupción del hilo se implementa utilizando el indicador interno del estado de interrupción. El estado de interrupción se establece cuando se llama al método de interrupción () del hilo (consulte la descripción del método de interrupción anterior).
Hay dos formas de obtener el estado de interrupción de un hilo:
Llame al método estático Thread.interrupted() Además de devolver el estado de interrupción del hilo actual, este método también borra el estado de interrupción del hilo actual. En otras palabras, si se llama a este método dos veces seguidas, la segunda llamada devolverá falso (después de que la primera llamada haya borrado su estado de interrupción y antes de que la segunda llamada haya verificado el estado de interrupción, el hilo actual se interrumpe nuevamente. excepciones ).
Llame al método isInterrupted () del subproceso especificado. Este método solo devuelve el estado de interrupción del subproceso especificado sin afectar el estado de interrupción del subproceso.
Hay dos formas de borrar el estado de interrupción de un hilo:
Como se mencionó anteriormente, llamar a Thread.interrupted()
Cuando se llama al método de interrupción () del hilo para causar InterruptedException, el estado de interrupción del hilo se ha borrado al mismo tiempo, incluido el método de espera (), espera (largo) o espera (largo, int) del Objeto. clase, o el método join() , join(long) , join(long, int) , sleep(long) o sleep(long, int) del hilo