处理线程抛出的异常
在多线程应用程序中,处理主线程中子线程抛出的异常至关重要。考虑以下场景:
<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中文网其他相关文章!