为什么java ThreadPoolExecutor在发生RuntimeException时会终止线程?

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

为什么java ThreadPoolExecutor在发生RuntimeException时会终止线程?

我只能猜测ThreadPoolExecutor.execute(...)直接调用runnable.run()的线程而不是将它包装在FutureTask是因为如果你不在乎你就不会产生FutureTask的开销关于结果。

如果你的线程抛出一个RuntimeException ,这有点是罕见的,并且没有机制将exception返回给调用者,那么为什么要为包装类付费呢? 最糟糕的情况是,线程被杀死,线程池将重新获取并重新启动。

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

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

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

但是我不确定,为什么ThreadPoolExecutor本身不处理它, ThreadPoolExecutor可以自己记录它。 创建新Thread并不是那么便宜。

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