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(); } } }
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); }
private native boolean isInterrupted(boolean ClearInterrupted);
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 threadEn 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 filpublic 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(); } } }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(); }
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 interrompuIl 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!