线程池处理异常

ThreadPoolExecutor处理一个Runnable任务:task,是放到任务队列里,所有线程在线程池的内部类Worker中,调用runWorker方法,无限循去队列里取,可以看到,task.run外面catch了异常但是又throw了,这个就是抛给JVM处理了,
看JVM源码,最后是catch住了打印在了tomcat的控制台上。

但是我们知道,线程池(或者其子类定时线程池)有时候并不是传一个简单的实现Runnable接口的任务,也有可能是封装成了FutureTask,而FutureTask的run方法中调用被其封装的那个Runnable的run方法,但是会自己捕捉后者的异常,然后改变state和outcome的值。这样异常就不会扔给JVM。

但是还有一个问题:定时线程池ScheduledThreadPoolExecutor明明用FutureTask捕捉了异常,定时任务第一次抛异常之后为什么还是执行不下去? 这是因为FutureTask的state改变了之后,runAndSet方法返回值为false,不会把FutureTask再放入队列中了。

猜你喜欢

转载自www.cnblogs.com/chuliang/p/12154755.html