首页 >Java >java教程 >Java中如何处理子线程抛出的异常?

Java中如何处理子线程抛出的异常?

Barbara Streisand
Barbara Streisand原创
2024-12-05 16:37:19827浏览

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

处理线程抛出的异常

在多线程应用程序中,处理主线程中子线程抛出的异常至关重要。考虑以下场景:

<br>public class Test extends Thread {<br> public static void main(String[] args) throws InterruptedException {<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) {

}

}
}

在此示例中,子线程中引发的异常不会传播到主线程。这是因为 Java 不会自动将线程中抛出的异常与主线程中的处理程序关联起来。

解决方案:Thread.UncaughtExceptionHandler

要处理线程中的异常,需要一可以使用 Thread.UncaughtExceptionHandler。该接口提供了 uncaughtException() 方法,当线程中发生未捕获的异常时,该方法将被调用。

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

通过将 uncaughtExceptionHandler 设置到线程,任何未捕获的异常都将由提供的实现处理。这允许主线程优雅地捕获和处理异常,确保正确的处理和错误报告。

以上是Java中如何处理子线程抛出的异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn