Maison  >  Article  >  Java  >  Comment résoudre les problèmes d'interruption de thread et de sortie en Java

Comment résoudre les problèmes d'interruption de thread et de sortie en Java

WBOY
WBOYoriginal
2023-10-09 09:16:471085parcourir

Comment résoudre les problèmes dinterruption de thread et de sortie en Java

Comment résoudre les problèmes d'interruption et de sortie de thread en Java

Dans le développement Java, les threads sont l'une des méthodes de programmation simultanée couramment utilisées. Cependant, gérer les problèmes d’interruption et de sortie des threads est une compétence importante. Cet article explique comment résoudre correctement les problèmes d'interruption et de sortie de thread en Java et fournit des exemples de code spécifiques.

Pour illustrer ce problème, supposons qu'il existe un thread T1, qui effectue une tâche fastidieuse. Nous voulons pouvoir interrompre et arrêter correctement l'exécution du thread T1 dans le thread principal.

Solution
En Java, l'opération d'interruption est implémentée en appelant la méthode interruption() du thread. Lorsque cette méthode est appelée, le thread T1 recevra un signal d'interruption. Cependant, le thread n’arrête pas immédiatement l’exécution mais continue de s’exécuter.

Afin de gérer correctement l'interruption du thread, nous pouvons utiliser la stratégie en deux étapes suivante :

  1. Détecter le signal d'interruption dans la tâche chronophage
    Afin de permettre au thread T1 de gérer le signal d'interruption à temps et quitter, nous devons détecter le signal d'interruption dans la tâche fastidieuse. Détecter périodiquement l'état d'interruption du thread. Le code suivant peut être inséré à une position critique de la tâche (comme le début de la boucle) :
if(Thread.currentThread().isInterrupted()){
    throw new InterruptedException();
}

Ce code détectera l'état d'interruption du thread en cours et lèvera une exception InterruptedException. En interceptant cette exception, vous donnez au thread une chance de quitter la tâche.

De plus, si la tâche chronophage est une opération bloquante (comme attendre qu'une ressource externe réponde), vous pouvez utiliser des méthodes de blocage interruptions, telles que Thread.sleep() et Object.wait(). Ces méthodes lanceront immédiatement InterruptedException en cas d'interruption. Nous n'avons besoin de quitter qu'après avoir détecté l'exception.

  1. Le thread principal envoie un signal d'interruption
    Lorsque nous devons interrompre le thread T1, nous pouvons appeler la méthode T1.interrupt() dans le thread principal pour envoyer un signal d'interruption au thread T1.

Voici un exemple de code complet :

public class InterruptExample {

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Worker());
        t1.start();

        // 休眠3秒,等待t1线程执行
        Thread.sleep(3000);

        // 中断线程t1
        t1.interrupt();
    }

    public static class Worker implements Runnable {
        public void run() {
            try {
                while (true) {
                    // 假设这里是一个耗时的任务
                    if (Thread.currentThread().isInterrupted()) {
                        throw new InterruptedException();
                    }
                    System.out.println("Running...");
                }
            } catch (InterruptedException e) {
                System.out.println("Caught InterruptedException, exiting...");
            }
        }
    }
}

Dans le code ci-dessus, nous créons un thread Worker et le démarrons dans le thread principal. Une fois que le thread principal s'est endormi pendant 3 secondes, appelez t1.interrupt() pour interrompre l'exécution du thread Worker.

Dans la méthode run() du thread Worker, nous utilisons la méthode isInterrupted() pour détecter l'état d'interruption et lancer une InterruptedException lorsque nous devons quitter.

Résumé
Gérer correctement les problèmes d'interruption et de sortie de thread en Java est une compétence importante en programmation simultanée. La détection des signaux d'interruption dans les tâches chronophages et l'utilisation de méthodes de blocage interruptibles peuvent permettre au thread de se terminer à temps. L'envoi d'un signal d'interruption dans le thread principal peut envoyer un signal d'interruption au thread de travail pour améliorer la contrôlabilité du programme.

J'espère que les solutions et les exemples de code de cet article pourront vous aider à gérer correctement les problèmes d'interruption de thread et de sortie en Java.

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:
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