为什么用线程的UncaughtExceptionHandler处理异常 -> Java: Handl
package com.doctor.java8; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 为什么用线程的UncaughtExceptionHandler处理异常 -> Java: Handling a RuntimeException in a Runnable * * 为什么用线程的UncaughtExceptionHandler处理异常。 * * @see http://www.javacodegeeks.com/2014/02/java-handling-a-runtimeexception-in-a-runnable.html * * ** 2和3方法采用3的原因如下:@see http://make-aitee-work.blogspot.de/2013/12/a-executor-is-not-thread-or-correct.html * * But this approach has two major drawbacks: First, it would also catch the InterruptedException which may be used to control the thread under * normal conditions. And second, the responsibility of error handling is moved to each Runnable implementation. You are going to implement a lot * of Runnables and it‘s easy to forget something. Executor error handling calls for a generic solution. * * Java 1.5 adds a method to register exception handlers for exactly this purpose: Thread.setUncaughtExceptionHandler(). Exceptions which are not * handled by the run() method of the Thread implementation, will be forwarded to this handler. Let‘s modify the above example to use a exception * handler: * @author doctor * * @time 2015年4月22日 上午9:07:35 */ public class HandlingRuntimeExceptionInRunnable { public static void main(String[] args) throws InterruptedException, ExecutionException { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2); // 1. 这种会导致发生异常的线程挂起,任务不能继续运行。卡住了。如果不调用get()获得结果,会退出。 // executorService.scheduleAtFixedRate(() -> { // System.out.println(Thread.currentThread().getName()); // // throw new RuntimeException("模拟异常"); // // }, 0, 1, TimeUnit.SECONDS).get(); // ------------------------------------------------------------------ // 2.这种异常任务不会挂起,调度程序会继续运行。这也是博文作者思路 // executorService.scheduleAtFixedRate(() -> { // System.out.println(Thread.currentThread().getName()); // try { // throw new RuntimeException("模拟异常"); // } catch (RuntimeException e) { // e.printStackTrace(); // } // // }, 0, 1, TimeUnit.SECONDS).get(); // ------------------------------------------------------------------ // 3.这是作者提到Java Concurrency in Practice书中的写法 executorService.scheduleAtFixedRate(() -> { System.out.println(Thread.currentThread().getName()); try { throw new RuntimeException("模拟异常"); } catch (RuntimeException e) { Thread t = Thread.currentThread(); t.getUncaughtExceptionHandler().uncaughtException(t, e); } }, 0, 1, TimeUnit.SECONDS).get(); System.out.println("exit"); executorService.shutdown(); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。