給執行緒池取一個名稱有助於除錯 - bozho

banq發表於2021-03-24

我們的軟體傾向於使用大量執行緒池-主要是透過java.util.concurrent.ExecutorService實現(透過建立Executors.new...。我們為各種非同步用例建立執行緒池,並且可以在各處看到它們。所有這些執行器都有執行緒工廠。它隱藏在預設的工廠方法,但您可以提供執行緒工廠;如果未提供,則在需要執行緒時使用預設的執行緒工廠。
使用spring時,可以使用建立<task:executor />。在這種情況下,每個執行程式服務的執行緒工廠由spring提供,並且使用執行程式bean的名稱(用指定id="executorName")。但是對於不是由spring建立的那些,將使用預設名稱,這是沒有幫助的,並且不允許您按名稱區分執行緒。
按名稱區分執行緒好處:如果遇到效能問題,您可以研究各種選項:執行緒轉儲和使用top命令。我最喜歡的快速調查工具是top。更確切地說,top -H -p <pid>。這顯示了通常的頂部表,但是-H標誌意味著應該按名稱列印用於所選程式的執行緒。
按名稱可以獲得最多的CPU繁忙且當前處於活動狀態的執行緒。在這些情況下,擁有自定義名稱非常有用。
 
但是,您如何設定名稱?透過在建立每個執行程式時指定一個命名執行緒工廠。這是一個有多種實現執行緒命名的方法stackoverflow答案

我使用的方法基於第二個答案:

public class AsyncUtils {
    public static ThreadFactory createNamedThreadFactory(String name) {
        return new ThreadFactoryBuilder().setNameFormat(name + "-%d").build();
    }
}

並不是每個人都在使用Spring,有時,甚至一小部分功能甚至都可以在Spring bean之外使用執行者。因此,最好是採用這種方法。
 

相關文章