Maison > Java > javaDidacticiel > le corps du texte

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

不言
Libérer: 2018-09-20 15:00:02
original
3474 Les gens l'ont consulté

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!