2012-10-24 83 views
1

可以創建各種類型的線程執行程序在Java中,singleThreadedExecutor,fixedThreadedExecutor等有沒有什麼辦法可以添加一些東西,以便當我在執行線程上調用getThreadName()getThreadID()時,我可以看到線程執行程序已經來了從?向Thread Executors添加更多信息?

謝謝。

+0

相關:http://stackoverflow.com/questions/3157852/should-threads-in-java-be-named-for-easier-debugging – 2012-10-24 20:22:53

回答

1

是的。您可以使用ThreadFactory實現來提供這些工廠方法。這是一個的Thread。因此,您可以在該方法中執行任何您喜歡的操作,例如設置其名稱,優先級或守護進程狀態 - 甚至可以使用自定義Thread子類。

1

如果使用,這是相當簡單:

final ThreadFactory threadFactory = new ThreadFactoryBuilder() 
     .setNameFormat("Fancy-pool-%02d") 
     .build(); 
Executors.newFixedThreadPool(10, threadFactory); 

如果你不快樂的用戶,你可以自己實現它:

final ThreadFactory threadFactory = new ThreadFactory() { 
    final AtomicInteger id = new AtomicInteger(); 

    @Override 
    public Thread newThread(Runnable r) { 
     final Thread thread = new Thread(r); 
     thread.setName("Fancy-pool-" + id.incrementAndGet()); 
     return thread; 
    } 
}; 

參見:

+0

你真的需要使用Atomic Integer嗎?我不清楚線程工廠是否具有併發訪問權限。它只是製造線程 - 不運行它們。是嗎?同樣你也需要每次都增加它。 – dublintech

+2

@dublintech:我基於這個例子說明了Guava和JDK如何實現線程工廠。也有可能兩個線程同時提交一些任務,並且突然線程池需要創建兩個線程來滿足不斷增長的需求。種族情況可能會發生。感謝關於增加計數器的四個小費,固定。 –

1

如果您在提交任務運行時考慮了線程的名稱,那麼我建議使用ThreadGroup。你也可以使用ThreadLocal,但這聽起來更像是一個黑客。

要使用ThreadGroup,您需要將自己的ThreadFactory注入執行程序。

final ThreadGroup threadGroup = new ThreadGroup("someThreadPoolName"); 
threadPool = Executors.newFixedThreadPool(10, new ThreadFactory() { 
    public Thread newThread(Runnable r) { 
     Thread thread = new Thread(threadGroup, r); 
     return thread; 
    } 
}); 

然後一個線程可以這樣做:

String myThreadPollName = Thread.currentThread().getThreadGroup().getName();