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

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

王林
王林original
2023-06-25 11:15:072312parcourir

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();
  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();

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();

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!

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