4

为什么调用execute方法时会在worker中重新抛出未处理的异常?结果,将在下次执行时创建新线程以最大化线程数

4

2 回答 2

3

为什么 java ThreadPoolExecutor 在 RuntimeException 发生时杀死线程?

我只能猜测直接ThreadPoolExecutor.execute(...)调用线程而不将其包装在 a 中的原因是,如果您不关心结果,就不会产生开销。runnable.run() FutureTaskFutureTask

如果您的线程抛出 a RuntimeException,希望这是一种罕见的事情,并且没有将异常返回给调用者的机制,那么为什么要为包装类付费?所以最坏的情况是,线程被杀死,将被线程池回收并重新启动。

于 2013-10-01T19:00:52.287 回答
3

没有办法正确处理异常。异常不能传播到调用者线程,也不能简单地吞下。

线程中抛出未处理的异常被委托给ThreadGroup.uncaughtException方法,该方法将输出打印到System.err.print,直到覆盖所需的行为ThreadGroup

所以这是预期的行为,它可以与在 main 方法中抛出未处理的异常进行比较。在这种情况下,JVM 终止执行并将异常打印到输出。

但是我不确定,为什么ThreadPoolExecutor不自己处理,ThreadPoolExecutor可以自己记录。创造新事物Thread并不便宜。

Thread也许有一个假设,应该释放一些与之相关的资源(native、threadLocal、threadStack 等) 。

于 2013-10-02T19:30:39.043 回答