Maison > Java > javaDidacticiel > le corps du texte

InterruptedException en Java - solution à l'exception d'interruption de thread

王林
Libérer: 2023-06-25 11:15:07
original
2326 Les gens l'ont consulté

InterruptedException en Java - Solution à l'exception d'interruption de thread

Dans la programmation multi-thread Java, l'exception d'interruption de thread est un problème courant et un problème qui nécessite une attention particulière. Lorsqu'un thread est en cours d'exécution et qu'un autre thread souhaite l'interrompre, une InterruptedException est levée. Cet article abordera les causes et les solutions d'InterruptedException.

  1. Cause of InterruptedException

InterruptedException est une exception levée en raison de l'interruption du thread. Pendant qu'un thread est en cours d'exécution, un autre thread peut l'interrompre via la méthode interruption(). Si le thread interrompu est dans un état d'attente, par exemple en attente d'opérations d'E/S ou en attente d'un verrou, une InterruptedException sera levée.

Par exemple, dans le code suivant, lorsque le thread t1 exécute Thread.sleep() pour dormir, le thread t2 l'interrompt, donc t1 lèvera une exception InterruptedException.

Thread t1 = new Thread(() -> {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        System.out.println("Thread interrupted");
    }
});
t1.start();

Thread t2 = new Thread(() -> {
    t1.interrupt();
});
t2.start();
Copier après la connexion
  1. Solution à InterruptedException

Lorsqu'un thread lève InterruptedException, nous devons le gérer en fonction de la situation spécifique. Normalement, nous devrions appeler Thread.currentThread().interrupt() dans le bloc catch pour réinterrompre le thread afin que l'appelant supérieur sache que le thread a été interrompu.

Par exemple, dans le code suivant, une fois l'exécution du thread t1 terminée, il vérifiera s'il a été interrompu et se réinterrompra dans le bloc catch.

Thread t1 = new Thread(() -> {
    try {
        Thread.sleep(5000);
        System.out.println("Thread finished");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Thread interrupted");
    }
});
t1.start();

Thread t2 = new Thread(() -> {
    t1.interrupt();
});
t2.start();
Copier après la connexion

De plus, si le thread effectue certaines opérations qui nécessitent un nettoyage des ressources, telles que la libération de verrous ou la fermeture de fichiers, nous devons également effectuer des opérations de nettoyage dans le bloc catch. Par exemple, dans le code suivant, une fois l'exécution du thread t1 terminée, il libérera des ressources et vérifiera s'il a été interrompu.

Thread t1 = new Thread(() -> {
    Lock lock = new ReentrantLock();
    lock.lock();
    try {
        Thread.sleep(5000);
        System.out.println("Thread finished");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Thread interrupted");
    } finally {
        lock.unlock();
    }
});
t1.start();

Thread t2 = new Thread(() -> {
    t1.interrupt();
});
t2.start();
Copier après la connexion

En bref, définir une méthode de gestion des exceptions InterruptedException est très critique. Cela peut nous aider à gérer correctement les opérations d'interruption de thread et à réduire autant que possible la complexité du code.

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