Maison > Java > javaDidacticiel > Comment puis-je gérer les exceptions générées par les threads enfants en Java ?

Comment puis-je gérer les exceptions générées par les threads enfants en Java ?

Barbara Streisand
Libérer: 2024-12-05 16:37:19
original
821 Les gens l'ont consulté

How Can I Handle Exceptions Thrown from Child Threads in Java?

Gestion des exceptions levées à partir des threads

Dans les applications multithread, il est essentiel de gérer les exceptions levées par les threads enfants dans le thread principal. Considérons le scénario suivant :

<br>public class Test extends Thread {<br> public static void main(String[] args) throws InterruptedException {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Test t = new Test();

try {
  t.start();
  t.join();
} catch (RuntimeException e) {
  System.out.println("** RuntimeException from main");
}

System.out.println("Main stoped");
Copier après la connexion

}

@Override
public void run() {

try {
  while (true) {
    System.out.println("** Started");

    sleep(2000);

    throw new RuntimeException("exception from thread");
  }
} catch (RuntimeException e) {
  System.out.println("** RuntimeException from thread");

  throw e;
} catch (InterruptedException e) {

}
Copier après la connexion

}
}

Dans cet exemple, une exception levée dans le thread enfant ne se propage pas au thread principal. En effet, Java n'associe pas automatiquement les exceptions lancées dans les threads aux gestionnaires du thread principal.

Solution : Thread.UncaughtExceptionHandler

Pour gérer les exceptions des threads, un peut utiliser un Thread.UncaughtExceptionHandler. Cette interface fournit une méthode uncaughtException() qui est appelée lorsqu'une exception non interceptée se produit dans un thread.

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
  @Override
  public void uncaughtException(Thread th, Throwable ex) {
    System.out.println("Uncaught exception: " + ex);
  }
};
Thread t = new Thread() {
  @Override
  public void run() {
    System.out.println("Sleeping ...");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      System.out.println("Interrupted.");
    }
    System.out.println("Throwing exception ...");
    throw new RuntimeException();
  }
};
t.setUncaughtExceptionHandler(h);
t.start();
Copier après la connexion

En définissant uncaughtExceptionHandler sur le thread, toutes les exceptions non interceptées seront gérées par l'implémentation fournie. Cela permet au thread principal de capturer et de traiter les exceptions avec élégance, garantissant ainsi une gestion et un rapport d'erreurs appropriés.

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!

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
Derniers articles par auteur
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal