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

时间:2013-10-01 18:41:40

标签: java concurrency

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

2 个答案:

答案 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等)。