为什么调用execute方法时会在worker中重新抛出未处理的异常?结果,将在下次执行时创建新线程以最大化线程数
2 回答
为什么 java ThreadPoolExecutor 在 RuntimeException 发生时杀死线程?
我只能猜测直接ThreadPoolExecutor.execute(...)
调用线程而不将其包装在 a 中的原因是,如果您不关心结果,就不会产生开销。runnable.run()
FutureTask
FutureTask
如果您的线程抛出 a RuntimeException
,希望这是一种罕见的事情,并且没有将异常返回给调用者的机制,那么为什么要为包装类付费?所以最坏的情况是,线程被杀死,将被线程池回收并重新启动。
没有办法正确处理异常。异常不能传播到调用者线程,也不能简单地吞下。
线程中抛出未处理的异常被委托给ThreadGroup.uncaughtException
方法,该方法将输出打印到System.err.print
,直到覆盖所需的行为ThreadGroup
。
所以这是预期的行为,它可以与在 main 方法中抛出未处理的异常进行比较。在这种情况下,JVM 终止执行并将异常打印到输出。
但是我不确定,为什么ThreadPoolExecutor
不自己处理,ThreadPoolExecutor
可以自己记录。创造新事物Thread
并不便宜。
Thread
也许有一个假设,应该释放一些与之相关的资源(native、threadLocal、threadStack 等) 。