ThreadPoolExecutor中线程什么时候死

When does thread die in ThreadPoolExecutor

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

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

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

线程在抛出异常时终止。这里唯一的问题是,如果我们在线程本地引用一个线程 ID,如果没有正确清除它可能会导致线程泄漏。

线程 ID 可以根据 java 文档重复使用。在我的例子中,我将一些东西放在线程本地引用线程 id (Thread.currentThread.getId)。清除它的最佳方法是覆盖 afterExecute(java.lang.Runnable, java.lang.Throwable) 并清理其中的内容。

来自 java 文档:

    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.