3 回答

TA贡献1864条经验 获得超2个赞
据我分析线程转储,当您使用 Spring 等框架或其他库(如您在此处使用的 Logback)时。他们根据您的配置创建线程池。例如,您可以在 applicationcontext.xml 或任何基于 java 的配置类中找到此类配置。因此,它的作用是,它将在应用程序启动或第一次初始化调用时创建那么多线程。如果有任何任务到来,那么框架将从池中选择一个线程并分配给它。任务完成后,线程将回到池中,此时线程状态将是WAITING(正在停车)。这并不意味着它被任何线程阻塞。如果您的服务器有足够的能力处理此类池,则不会导致任何性能问题。他们只是坐在理想的位置,因为他们没有任何任务要做。

TA贡献1804条经验 获得超7个赞
根据上面的堆栈跟踪,有以下推论
有一个队列Q。
N 个作业(可运行)被添加到队列中。
这些作业将从队列中取出并由 ThreadPoolExecutors 中的线程执行(可以缓存/动态)。
假设,我们有一个只有两个线程(固定大小)的线程池执行器,并且您只向队列提交了一个作业。(作业1)
Thread1从队列中取出job1并执行。一旦执行结束,就会进入WAITING状态,因为队列中没有元素。它没有工作要做。堆栈跟踪上存在等待线程并不意味着它们是有害的。

TA贡献1816条经验 获得超6个赞
您可能要做的第一件事是搜索 Runnable 线程及其已锁定的同步器。可运行线程如果长时间挂起,则很有可能正在执行 IO 或 DB 操作。以 30 秒左右的间隔进行后续线程转储并进行比较研究。
添加回答
举报