En este artículo, hablaremos sobre el mecanismo de interrupción de interrupción del hilo de Java.
Hilo de interrupción
El método thread.interrupt () del hilo es interrumpir el hilo. Establecerá el bit de estado de interrupción del hilo, es decir, establecido en True. Si el hilo interrumpido muere, espera una nueva tarea o continúa ejecutándose al siguiente paso depende del programa en sí. El hilo detectará este indicador de interrupción de vez en cuando para determinar si el hilo debe interrumpirse (si el indicador de interrupción es verdadero). No interrumpe un hilo en ejecución como el método de parada.
Determinar si el hilo está interrumpido
Para determinar si un hilo ha enviado una solicitud de interrupción, use el método Thread.CurrentThread (). ISInterrupted () (porque no borrará el bit de indicador de interrupción inmediatamente después de configurar el bit de indicador de interrupción de hilo en verdadero, es decir, no establecerá el indicador de interrupción en falso). En su lugar, no use el método Thread.interrupted () (el bit de indicador de interrupción se borrará después de que se llame el método, es decir, restablecer a falso) para juzgar. El siguiente es el método de interrupción del hilo cuando está en un bucle:
while (! Thread.CurrentThread (). ISInterrupted () && More Work to Do) {Do más trabajo}Bandera de estado de interrupción
Existen los siguientes métodos en el mecanismo de interrupción de interrupción:
Por lo tanto, el mecanismo de interrupción de interrupción realmente no interrumpe el hilo actual, sino un cambio en el marcado de interrupción. Probemos con ejemplos primero.
Public Class InterruptSt {// El tiempo consumido aquí se usa para imprimir estática privada mucho tiempo = 0; Private static void resettime () {time = system.currentTimemillis (); } private static void printContent (contenido de cadena) {System.out.println (content + "Time:" + (System.CurrentTimemillis () - Time)); } public static void main (string [] args) {test1 (); } private static void test1 () {Thread1 Thread1 = new Thread1 (); Thread1.Start (); // interrumpir la interrupción después de 3 segundos de demora, try {Thread.sleep (3000); } catch (InterruptedException e) {E.PrintStackTrace (); } thread1.interrupt (); printContent ("Interrupción de ejecución"); } La clase estática privada hilo1 extiende el hilo {@Override public void run () {resetTime (); int num = 0; while (true) {if (isInterrupted ()) {printContent ("El hilo actual se introduce"); romper; } num ++; if (num % 100 == 0) {printContent ("num:" + num); }}}}}}}El código anterior es iniciar un hilo de hilo1 y agregar continuamente 1 al num en el bucle while del hilo de subproceso1, e imprimirlo una vez cada múltiplo de 100 (evite que la impresión sea demasiado rápida). Luego, después de dormir durante 3000 milisegundos, el hilo principal llama al método de interrupción del hilo de hilo1. Entonces veamos la salida:
interrupción de interrupción
Se puede ver que después de tomar alrededor de 3000 milisegundos, es decir, después de que el hilo principal duerme, el hilo de hilo1 se detiene y el hilo de hilo1 se detiene porque el método ISInterrupted en el bucle while devuelve verdadero, así que rompa sale el bucle while. Es decir, el papel de la interrupción y se introducen aquí es equivalente al papel de SETXX y GETXX, manteniendo una variable booleana.
Manejo de excepciones de interrupción
Por supuesto, el mecanismo de interrupción no es solo un cambio y detección de bits de estado de interrupción, sino que también puede manejar las excepciones de interrupción. Sabemos que el método Thread.sleep () debe captar la excepción de interrupción, así que le agregemos un retraso de sueño y lo intentemos
while (true) {if (isInterrupted ()) {printContent ("El hilo actual se introduce"); romper; } num ++; // Sleep ty {thread.sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } if (num % 100 == 0) {printContent ("num:" + num); }}Veamos el resultado de la salida:
interrupción de interrupción
Aquí encontraremos que después de dormir, el valor numérico de salida es significativamente menor (los números alcanzan los mil millones cuando no están durmiendo, y parece que la CPU realiza operaciones simples muy rápidamente). Jaja, pero este no es el punto. El punto es que después de la excepción de salida, la salida ISInterrupted devuelve False, y el subproceso de Thread1 continúa ejecutándose y no sale del bucle While. Entonces, ¿por qué es esto? Acabamos de agregar un sueño.
Si hay una operación en el hilo de Thread1 que necesita atrapar la excepción de InterruptedException, como el sueño de Sleep, el método de unión, la espera de Object, la condición, etc., obliga a la excepción de Excepción InterruptedException a la captura, luego, cuando se llama el método de subproceso. Luego, en el bucle While, esta excepción se puede atrapar y luego, después de que se lanza esta excepción, el indicador de interrupción del hilo se restablecerá a False de inmediato. Por lo tanto, cuando se introduce en la próxima vez que se determine que el bucle While es falso, no se romperá, y luego el bucle While continuará ejecutándose.
Por lo tanto, el método de interrupción () realizará diferentes operaciones en función de si hay código en el método Ejecutar en el hilo de hilo que debe atrapar la EXCEPTCIÓN DE INTERRUPTEDECHE:
Escenarios de aplicación de interrupción
Por lo general, la interrupción es adecuada para juicios de marca de bucle en la ejecución de hilos, por ejemplo
while (! isinterrupted ()) {...} Sin embargo, si hay un bloqueo en este bucle, el hilo no puede juzgar la siguiente etiqueta ISInterrupted, e incluso si se llama al método de interrupción (), no puede salir del bucle, y el hilo no puede salir. Por ejemplo
while (! isinterrupted ()) {... while (true) {// El hilo está atascado aquí, el mecanismo interrumpido no se puede responder a}}De esta manera, la interrupción será indefensa, y el hilo continuará ejecutándose y no será interrumpido y detenido.
Prueba ejemplos para ver mi github-Javatest
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.