1. Interrompre des points de connaissance
Le résumé suivant est basé sur JDK8
Cet article n'expliquera pas entièrement l'interruption, mais lira les points plus importants. Pour une compréhension complète du thread.interrupt, vous pouvez voir les matériaux de référence.
Voici quelques nouveaux articles qui aident à comprendre les références:
Une fois la méthode d'interruption appelée, l'indicateur d'interruption est défini sur true pour les threads à l'état bloqué. La question de répondre aux interruptions (consciente des changements dans ce bit de drapeau) dépend de la conception de l'API. L'API IO de blocage de JDK, le bloc de synchronisation synchronisé et de nombreuses méthodes de verrouillage (à l'exclusion de lockinterruptibles) ne répondent pas aux interruptions. Bien sûr, le fil d'appel peut utiliser le jugement du bit de drapeau pour faire en sorte que l'API conçue par elle-même répond aux interruptions.
Une fois la méthode d'interruption appelée, l'interruptedException ** sera lancée sur le thread dans l'état d'attente / timed_waiting et l'interrupteur bit false ** sera défini. Par exemple, après que le thread appelle Thread.Sleep, object.wait ().
Si le thread n'a pas commencé (nouveau) ou s'est terminé (terminé), appeler Interrupt () n'a aucun effet sur celui-ci et l'indicateur d'interruption ne sera pas défini.
Meilleures pratiques: Parfois, certaines méthodes ne sont pas autorisées à être interrompues ou annulées dans la conception, mais lorsque d'autres threads envoient des demandes d'interruption, ils doivent également maintenir des marques pour faciliter d'autres appelants pour "comprendre la situation".
Tâche publique getNextTask (BlockingQueue <Task> file d'attente) {Boolean Interrupted = false; try {while (true) {try {return queue.take (); } catch (InterruptedException e) {// La marque de statut de dépendance dans fianly interrupted = true; // tombe et réessayer}}} enfin {if (interrompu) // Remarque dans fianly pour s'assurer qu'il n'y a pas de notification d'interruption manquante thread.currentThread (). Interrupt (); }}Certaines opérations d'annulation peuvent être implémentées à l'aide d'interruptions. Par exemple:
Package concurrent; Importer java.util.concurrent.blockingQueue; import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors; / ** * créé par Wanshao * Date: 2017/12/18 * Temps: 3:42 pm ** / Classe publique: 2017/12/18 * Temps: 3:42 pm ** / Classe publique: 2017/12/18 * Temps: 3:42 pm ** / Class Public: 2017/12/18 * Temps: 3:42 PM ** / CASSE PUBLIC {public static void main (String [] args) lève InterruptedException {interruptAsk interruptAsk = new interruptAsk (); ExecutorService ExecutorService = exécutor ExecutorService.Submit (interruptAsk); Thread.Sleep (100); InterruptAsk.Cancel (); ExecutorService.shutdown (); }} / ** * Une tâche qui répond à l'interruption * / class InterruptAsk implémente callable <Integer> {private BlockerQueue <Task> file d'attente; // Enregistrez le fil du fil pour être interrompu T; @Override public Integer Call () lève InterruptedException {System.out.println ("Démarrer une tâche bloquée"); essayez {t = thread.currentThread (); Thread.currentThread (). Sleep (50000); } catch (InterruptedException e) {System.out.println ("être interrompu"); e.printStackTrace (); } return 0; } public void annule () {System.out.println ("cacel a tâche ...."); // appelle thread.currentThread () ici obtiendra le thread principal, plutôt que le thread dans le pool de thread if (! T.isinterrupt ()) {t.interrupt (); }}}Résumer
Ce qui précède est la mise à jour de Java basée sur le résumé JDK8 introduit par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!