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 秒左右的間隔進行后續線程轉儲并進行比較研究。
添加回答
舉報