线程何时在ThreadPoolExecutor中死亡

时间:2016-08-18 18:55:59

标签: java jvm executorservice threadpoolexecutor executor

问题: 我想知道什么时候在线程的run方法中抛出RunTimeException,是否会保留该线程的本地线程?这个问题的答案在于我在下面提出的问题。所以说,如果线程死掉(当抛出异常时)它的线程本地快照被清除,或者如果线程没有死,那么在那种情况下线程本地发生的事情就会消失。我们需要以编程方式处理吗? 场景: 在重负载期间,请求进入并且处理时间过长并且在创建响应之前,异步上下文超时。在这种情况下会发生什么?处理请求的线程会发生什么?

以下是更多详情: 我一直在研究ThreadPoolExecutors如何在内部工作。我很想知道在线程的run方法中抛出RunTimeException时会发生什么。是否会被杀死并且ThreadPoolExecutor最终会创建全新的线程?或者JVM不知何故不让该线程死掉,以便它可以重用 游泳池。我认为线程死了,它的ThreadLocal快照也是如此。 我想深入了解ThreadPoolExecutor如何处理异常以及特定线程的生命周期如何围绕它。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

谢谢大家!我得到了答案。

抛出异常时线程死亡。只有在这里捕获的是我们在线程本地引用一个线程id,如果没有正确清除它可能导致线程泄漏。

可以根据java文档重用线程ID。在我的情况下,我把一些东西放在线程本地引用线程id(Thread.currentThread.getId)。清除它的最好方法是覆盖afterExecute(java.lang.Runnable,java.lang.Throwable)并清理那里的东西。

来自java docs:

    public long getId()
    Returns the identifier of this Thread. The thread ID is a positive long number generated when this thread was created. The thread ID is unique and remains unchanged during its lifetime. When a thread is terminated, this thread ID may be reused.