1. Interrumpir puntos de conocimiento
El siguiente resumen se basa en JDK8
Este artículo no explicará completamente la interrupción, pero solo enumerará algunos puntos más importantes. Para una comprensión completa de Thread. Interrupción, puede ver los materiales de referencia.
Aquí hay algunos artículos nuevos que ayudan a comprender las referencias:
Después de que se llama al método de interrupción, el indicador de interrupción se establece en verdadero para hilos en el estado bloqueado. Si responder a las interrupciones (consciente de los cambios en este bit de bandera) depende del diseño de la API. La API de bloqueo de IO de JDK, el bloque de sincronización sincronizado y muchos métodos en el bloqueo (excluyendo el bloqueo de infinición) no responden a las interrupciones. Por supuesto, el hilo de llamadas puede usar el juicio de bits de bandera para hacer que la API diseñada por sí misma responda a las interrupciones.
Después de que se llame el método de interrupción, el interrupción de Excepción ** se arrojará al hilo en el estado Waiting/Timed_Waiting y se establecerá el Bit False ** de la bandera de interrupción **. Por ejemplo, después de que el hilo llama a Thread.sleep, Object.Wait ().
Si el hilo no ha comenzado (nuevo) o ha terminado (terminado), llamar a la interrupción () no tiene ningún efecto en él, y el indicador de interrupción no se establecerá.
Las mejores prácticas: a veces no se permite que algunos métodos se interrumpan o cancelen en el diseño, pero cuando otros hilos envían solicitudes de interrupción, también deben mantener marcas para facilitar a otras personas que llaman "comprender la situación".
Tarea pública getNextTask (Bloquingqueue <ark> queue) {boolean interrumped = false; intente {while (true) {try {return queue.take (); } capt (interruptedException e) {// La marca de estado de dependencia en Fianlly interrumped = true; // cae y vuelve a intentar}}} Finalmente {if (interrumped) // Comentar en Fianlly para asegurarse de que no falte Notificación de interrupción. CurrentThread (). Interrupt (); }}Algunas operaciones de cancelación se pueden implementar utilizando interrupciones. Por ejemplo:
paquete concurrente; import java.util.concurrent.blowingqueue; import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors;/** * creado por wanshao * Date: 2017/12/18 * tiempo: 3:42 PM ** public static void main (string [] args) lanza interruptedException {interruptTask interruptTask = new InterruptTask (); EjecutorService EjecutorService = Ejecutors.NeWSingLethreadExeCutor (); EjecutorService.subMit (InterruptTask); Hilt.sleep (100); InterruptTask.Cancel (); EjecutorService.shutdown (); }}/*** Una tarea que responde a la interrupción*/class InterruptTask implementa Callable <Integer> {private Bloquingqueue <Kark> queue; // Guardar el hilo para ser interrumpido hilo t; @Override public Integer Call () lanza InterruptedException {System.out.println ("Iniciar una tarea bloqueada"); intente {t = thread.currentThread (); Thread.CurrentThread (). Sleep (50000); } capt (interruptedException e) {system.out.println ("ser interrumpido"); E.PrintStackTrace (); } return 0; } public void Cancel () {System.out.println ("Cacel una tarea ..."); // llamando a thread.currentThread () aquí obtendrá el hilo principal, en lugar del hilo en el grupo de hilo if (! T.isinterrupt ()) {t.interrupt (); }}}Resumir
La anterior es la actualización en Java basada en el resumen JDK8 introducido por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!