Maison Java javaDidacticiel Qu'est-ce qu'une interruption de thread en Java ? Quels problèmes l'interruption du thread Java entraînera-t-elle ?

Qu'est-ce qu'une interruption de thread en Java ? Quels problèmes l'interruption du thread Java entraînera-t-elle ?

Sep 20, 2018 pm 03:00 PM
java线程

Le contenu de cet article porte sur ce qu'est une interruption de thread en Java ? Quels problèmes l’interruption du thread Java entraînera-t-elle ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Qu'est-ce qu'une interruption de fil ?

En fait, il y a plus d'un thread d'exécution dans notre programme Java. Ce n'est que lorsque tous les threads auront fini de s'exécuter que le programme Java sera considéré comme terminé. La description officielle est la suivante : Ce programme Java peut se terminer lorsque tous les threads non-démons ont fini de s'exécuter ou lorsque l'un des threads appelle la méthode System.exit().

Scénarios d'application d'interruption de thread

Donnons d'abord un exemple. Par exemple, nous téléchargeons un blockbuster de plus de 500M, et nous cliquons pour lancer le téléchargement à ce moment-là, c'est équivalent. pour démarrer un fil de discussion. Allez télécharger nos fichiers. Cependant, notre vitesse Internet n'est pas très forte en ce moment. Des dizaines de fichiers KB fonctionnent ici. En tant que jeune homme, je ne peux plus attendre. , notre première opération à ce moment est de terminer le téléchargement. Cette opération de téléchargement de fichiers est en fait plus proche du programme. À ce moment, nous devons interrompre le fil.

Écrivons ensuite le code de téléchargement et voyons comment interrompre un fil de discussion. Ici, j'ai supposé que vous maîtrisiez comment créer un fil de discussion. Dans ce programme, nous simulons le téléchargement. obtenez d'abord l'heure du système, puis entrez dans la boucle pour obtenir l'heure du système à chaque fois. Si le temps dépasse 10 secondes, nous interromprons le fil et arrêterons le téléchargement. La vitesse de téléchargement est de 1 M par seconde :

<.>
public void run() {

       int number = 0;

       // 记录程序开始的时间
       Long start = System.currentTimeMillis();

       while (true) {

           // 每次执行一次结束的时间
           Long end = System.currentTimeMillis();

           // 获取时间差
           Long interval = end - start;

           // 如果时间超过了10秒,那么我们就结束下载
           if (interval >= 10000) {
               // 中断线程
               interrupted();
               System.err.println("太慢了,我不下了");
               return;
           } else if (number >= 500) {
               System.out.println("文件下载完成");
               // 中断线程
               interrupted();
               return;
           }

           number++;
           System.out.println("已下载" + number + "M");

           try {
               Thread.sleep(2000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }
Copier après la connexion

Comment interrompre un thread

La classe Thread nous fournit une méthode pour interrompre un thread. Voyons d'abord comment cette méthode interrompt un thread : <🎜. >

Cette méthode consiste à vérifier si le thread actuel est interrompu. L'interruption renvoie vrai, et la non-interruption renvoie faux
public static boolean interrupted() { 
      return currentThread().isInterrupted(true);
   }
Copier après la connexion


En regardant le code source, nous pouvons constatez qu'interrompre le thread consiste à vérifier si le thread est interrompu par la méthode appelante, définissez la valeur sur true. À ce stade, lorsque vous appelez la méthode pour vérifier si le thread est interrompu, elle renverra true.
private native boolean isInterrupted(boolean ClearInterrupted);
Copier après la connexion

Tout le monde doit faire attention à un problème ici : la méthode Thread.interrupted() modifie uniquement l'état du thread en cours pour lui indiquer d'être interrompu, mais pour les threads non bloqués, elle ne modifie que l'interruption. statut, c'est-à-dire que Thread.isInterrupted () renvoie true. Pour les threads dans un état de blocage annulable, tels que les threads en attente de ces fonctions, Thread.sleep(), ce thread lancera une InterruptedException après avoir reçu le signal d'interruption et l'interruption. le statut sera défini en même temps est vrai.

La raison de l'InterruptedException causée par la veille du thread

En fait, tout le monde comprend un peu cela, je vais donc écrire un exemple incorrect. résolvez ce problème en profondeur. Découvrez-le :

Ceci est notre programme principal, attendez 10 secondes puis interrompez le fil
public void run() {

       int number = 0;

       while (true) {
           // 检查线程是否被中断,中断就停止下载
           if (isInterrupted()) {

               System.err.println("太慢了,我不下了");
               return;
           } else if (number >= 500) {
               System.out.println("下载完成");
               return;
           }

           number++;
           System.out.println("已下载" + number + "M");

           try {
               Thread.sleep(2000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }
Copier après la connexion

Cela ressemble à un programme normal, mais le fait n'est pas ce que vous voyez. Il semble qu'en fait, ce code lancera InterruptedException, analysons la raison.
public static void main(String[] args) throws InterruptedException {

       Thread thread = new PrimeGenerator();

       // 启动线程
       thread.start();

       // 等待10秒后中断线程
       Thread.sleep(1000);

       // 中断线程
       thread.interrupt();
   }
Copier après la connexion

Ici, nous devons d'abord comprendre que la méthode Thread.interrupt() n'interrompra pas un thread en cours d'exécution. Lorsque la méthode Thread.sleep() est appelée, elle ne le fera plus. être occupé en ce moment, analysons notre programme. Nous devons attendre 10 secondes pour télécharger. La vitesse de chaque téléchargement est de 0,5 M/S. À ce moment-là, nous appelons la méthode Thread.interrupt() pour interrompre le thread, mais le sommeil dans la méthode run() continuera à être exécuté. Il n'abandonnera pas l'exécution du code suivant en raison de l'interruption. exécute à nouveau Thread.sleep(), ce sera le cas. Une exception InterruptedException est levée car le thread en cours a été interrompu.

Avez-vous compris la raison de cette exception ? De plus, il existe deux autres raisons pour lesquelles les threads génèrent des exceptions InterruptedException. Une mauvaise utilisation des méthodes wait() et join() peut également amener les threads à lever cette exception.

Deux façons de vérifier si un thread est interrompu

Il existe une méthode interrompue() dans la classe Thread qui peut être utilisée pour vérifier quand le thread en cours est interrompu , et la méthode isInterrupted() peut être utilisée pour vérifier si le thread actuel est interrompu.

La méthode sous-jacente pour interrompre un thread consiste à définir cette propriété sur true, et la méthode isInterrupted() renvoie simplement la valeur de cette propriété.

Une différence entre ces deux méthodes est que isInterrupted() ne peut pas modifier la valeur d'attribut de interrompu(), mais la méthode interrompue() peut modifier la valeur d'attribut de interrompu, donc pour déterminer quand un thread est interrompu, nous vous recommandons d'utiliser isInterrupted().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Explication détaillée des cinq états des threads Java et des règles de transition d'état Explication détaillée des cinq états des threads Java et des règles de transition d'état Feb 19, 2024 pm 05:03 PM

Compréhension approfondie des cinq états des threads Java et de leurs règles de conversion 1. Introduction aux cinq états des threads En Java, le cycle de vie d'un thread peut être divisé en cinq états différents, dont l'état nouveau (NEW) et l'état prêt. (RUNNABLE), l'état d'exécution (RUNNING), l'état de blocage (BLOCKED) et l'état de fin (TERMINATED). Nouvel état (NEW) : lorsque l'objet thread est créé, il est dans le nouvel état. À ce stade, l'objet thread a alloué suffisamment de ressources pour effectuer la tâche.

Comment résoudre l'exception de délai d'attente d'interruption du thread Java (InterruptedTimeoutException) Comment résoudre l'exception de délai d'attente d'interruption du thread Java (InterruptedTimeoutException) Aug 22, 2023 am 09:51 AM

Comment résoudre l'exception de délai d'attente d'interruption de thread Java (InterruptedTimeoutException) Introduction : Dans la programmation simultanée, l'opération d'interruption de thread est un moyen technique très courant. Il peut être utilisé pour mettre fin à des threads qui n'ont plus besoin de s'exécuter ou pour collaborer entre plusieurs threads. Cependant, il arrive parfois que l'interruption du thread ne se déroule pas correctement et qu'un délai d'interruption puisse survenir. Cet article explique comment résoudre l'exception de délai d'attente d'interruption du thread Java (InterruptedTimeout

Problèmes de sécurité des threads dans Java-java.lang.ThreadDeath Problèmes de sécurité des threads dans Java-java.lang.ThreadDeath Jun 25, 2023 am 08:15 AM

Java est un langage de programmation multiplateforme. En raison de ses avantages tels que la portabilité, la facilité d'apprentissage et la facilité d'utilisation, il est devenu un acteur important dans le domaine de la programmation informatique. Cependant, la sécurité des threads a toujours été un problème important dans la programmation Java. Les problèmes de sécurité des threads en Java peuvent ne pas sembler faciles à détecter en surface, mais ils conduisent souvent à des situations inquiétantes. Cet article explorera un problème de sécurité des threads en Java : java.lang.ThreadDeath. Problèmes de sécurité des threads en Java dans plusieurs threads

Méthodes pour résoudre l'exception d'état du thread Java (ThreadStateException) Méthodes pour résoudre l'exception d'état du thread Java (ThreadStateException) Aug 18, 2023 am 11:53 AM

Méthodes pour résoudre l'exception d'état du thread Java (ThreadStateException) Introduction : Lorsque vous utilisez la programmation multi-thread Java, vous rencontrez souvent le problème de l'exception d'état du thread (ThreadStateException). Lorsque nous appelons certaines méthodes du thread, si l'état du thread ne répond pas aux exigences de la méthode, une ThreadStateException sera levée. Cet article présentera les causes et les solutions des exceptions d'état des threads et donnera des exemples de code pertinents.

Comment résoudre l'exception d'erreur de délai d'attente d'interruption du thread Java (ThreadInterruptedTimeoutErrorExceotion) Comment résoudre l'exception d'erreur de délai d'attente d'interruption du thread Java (ThreadInterruptedTimeoutErrorExceotion) Aug 18, 2023 pm 07:33 PM

Comment résoudre l'exception d'erreur de délai d'attente d'interruption du thread Java (ThreadInterruptedTimeoutErrorException) Au cours du processus de développement Java, nous utilisons souvent le multithreading pour améliorer les performances de concurrence et l'efficacité du programme. Cependant, lors de l'utilisation de threads, nous pouvons rencontrer certains problèmes, tels qu'une exception d'erreur de délai d'expiration du thread (ThreadInterruptedTimeoutErrorException). Cet article expliquera comment résoudre ce problème,

Une description détaillée des cinq états des threads Java ainsi que de leurs caractéristiques et performances dans les environnements multithreads Une description détaillée des cinq états des threads Java ainsi que de leurs caractéristiques et performances dans les environnements multithreads Feb 18, 2024 pm 07:07 PM

Décrivez en détail les cinq états des threads Java ainsi que leurs caractéristiques et performances dans un environnement multithread. Java est un langage de programmation orienté objet. Ses caractéristiques multithread nous permettent d'effectuer plusieurs tâches en même temps et d'améliorer la concurrence et. réponse du programme sexe. En Java, les threads ont cinq états différents, à savoir le nouvel état (New), l'état exécutable (Runnable), l'état bloqué (Blocked), l'état d'attente (Waiting) et l'état terminé (Terended). Cet article présentera cela en détail

Etude approfondie de plusieurs états des threads Java et de leur impact sur l'exécution du programme Etude approfondie de plusieurs états des threads Java et de leur impact sur l'exécution du programme Feb 21, 2024 pm 11:27 PM

Étude approfondie de plusieurs états des threads Java et de leur impact sur l'exécution d'un programme. En Java, un thread est une unité d'exécution légère qui peut s'exécuter de manière indépendante dans un programme et effectuer des tâches spécifiques. Le statut d'un thread décrit les différentes étapes de l'exécution d'un thread. Comprendre l'état d'un thread est très important pour écrire des programmes multithread et optimiser les performances du programme. Cet article examinera plusieurs états des threads Java et leur impact sur l'exécution du programme, et fournira des exemples de code spécifiques. Plusieurs états des threads Java incluent : NEW (nouveau),

Méthodes pour résoudre l'exception de communication inter-thread Java (ThreadCommunicationException) Méthodes pour résoudre l'exception de communication inter-thread Java (ThreadCommunicationException) Aug 18, 2023 pm 09:34 PM

Méthodes pour résoudre l'exception de communication inter-thread Java (ThreadCommunicationException) Dans les programmes Java, la communication entre les threads est une exigence très courante. Cependant, en raison des caractéristiques d'exécution simultanées des threads, des exceptions peuvent se produire dans la communication entre threads, telles que ThreadCommunicationException. Cet article explique comment résoudre cette exception et donne des exemples de code correspondants. Contexte de l'exception Dans la programmation multithread, différents threads doivent partager des données ou effectuer

See all articles