Java ThreadPoolExecutor中的线程何时死亡

Java ThreadPoolExecutor中的线程何时死亡,java,jvm,executorservice,threadpoolexecutor,executor,Java,Jvm,Executorservice,Threadpoolexecutor,Executor,问题: 我想知道当在线程的run方法中抛出RunTimeException时,该线程的本地线程是否会被保留?这个问题的答案在于我下面要问的。所以,如果线程死亡(当抛出异常时),则清除线程本地快照,或者如果线程未死亡,则在这种情况下线程本地会发生什么。我们需要通过编程来处理这个问题吗? 脚本: 在重载期间,请求进入,处理时间过长,在创建响应之前,异步上下文超时。在这种情况下会发生什么?处理请求的线程会发生什么情况 详情如下: 我一直在研究ThreadPoolExecutors内部如何工作。我想知道

问题: 我想知道当在线程的run方法中抛出RunTimeException时,该线程的本地线程是否会被保留?这个问题的答案在于我下面要问的。所以,如果线程死亡(当抛出异常时),则清除线程本地快照,或者如果线程未死亡,则在这种情况下线程本地会发生什么。我们需要通过编程来处理这个问题吗? 脚本: 在重载期间,请求进入,处理时间过长,在创建响应之前,异步上下文超时。在这种情况下会发生什么?处理请求的线程会发生什么情况

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

谢谢大家!我得到了答案

抛出异常时线程死亡。这里唯一需要注意的是,如果我们在thread local中引用了一个线程id,如果该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.

为什么您关心这些实施细节?担心的是接口,而不是实现。如果你真的在乎,你应该自己深入研究代码。StackOverflow用于询问您遇到的问题。由于好奇而不是问题而分解JDK中每个模块的实现会导致混乱。这是一个帮助解决导致意外或无法解释结果的问题的网站。“我一直在研究ThreadPoolExecutors内部的工作方式。”-所以我假设您已经阅读了JDK附带的源代码。您对源代码的哪一部分有困难?这在runWorker方法的源代码中。谢谢@NathanHughes。我已经更新了描述,以提供问题背后的动机,这样人们就不会认为这是一个杂乱无章的问题。@Coder我无意冒犯。我知道新用户认为StackOverflow适用于任何与编程相关的东西,而实际目的是帮助开发人员克服障碍,或者理解令人惊讶的结果。这个问题仍然没有问题,所以我的评论仍然有效。就像我说的,你希望我们在任何时候有人问起的时候分解JDK模块吗?是什么使得理解本模块比理解其他模块如何工作更重要?如果您有问题,请随时发布。如果你对它的工作原理很好奇,为什么不自己研究一下源代码呢?