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