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
Barbara Streisandoriginal
2024-12-05 16:37:19851parcourir

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

}

@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) {

}

}
}

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

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!

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