-
任何代码都可能抛出RuntimeException,所以每当调用另一个方法时,都要对它的行为保持怀疑
-
两种方式处理可能的非正常线程终止情况
(1) 把任务套在try块中,如果抛出异常先通知一下框架该线程已经终结
线程池和Swing都用了这个方法
线程池__工作者线程__的伪代码
public void run() { Throwable thrown = null; try { while (!isInterrupted()) { runTask(getTaskFromWorkQueue()); //主体部分 } } catch (Throwable e) { thrown = e; } finally { threadExited(this, thrown); //通知框架当前线程的终止信息 }
(2) 实现UncaughtExceptionHandler接口,当某个线程由于未捕获异常而退出时,JVM将事件报告给UncaughtExceptionHandler的实现类处理
示例
public class UEHLogger implements Thread.UncaughtExceptionHandler { public void uncaughtException(Thread t, Throwable e) { Logger logger = Logger.getAnonymousLogger(); logger.log(Level.SEVERE, "Thread terminated with exception: " + t.getName(), e); } }
注:
使用execute()方法提交的任务,如果抛出未捕捉异常会触发UncaughtExceptionHandler;但是使用submit()方法抛出的未捕捉异常不会交给UncaughtExceptionHandler,而是把异常封装进Future对象中,作为Future.get()的ExecutionException
chapter07_取消与关闭_3_处理非正常的线程终止
最新推荐文章于 2022-11-30 17:45:22 发布