可以創建各種類型的線程執行程序在Java中,singleThreadedExecutor
,fixedThreadedExecutor
等有沒有什麼辦法可以添加一些東西,以便當我在執行線程上調用getThreadName()
和getThreadID()
時,我可以看到線程執行程序已經來了從?向Thread Executors添加更多信息?
謝謝。
可以創建各種類型的線程執行程序在Java中,singleThreadedExecutor
,fixedThreadedExecutor
等有沒有什麼辦法可以添加一些東西,以便當我在執行線程上調用getThreadName()
和getThreadID()
時,我可以看到線程執行程序已經來了從?向Thread Executors添加更多信息?
謝謝。
是的。您可以使用ThreadFactory
實現來提供這些工廠方法。這是一個的Thread
。因此,您可以在該方法中執行任何您喜歡的操作,例如設置其名稱,優先級或守護進程狀態 - 甚至可以使用自定義Thread
子類。
如果使用guava,這是相當簡單:
final ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat("Fancy-pool-%02d")
.build();
Executors.newFixedThreadPool(10, threadFactory);
如果你不快樂的guava用戶,你可以自己實現它:
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;
}
};
你真的需要使用Atomic Integer嗎?我不清楚線程工廠是否具有併發訪問權限。它只是製造線程 - 不運行它們。是嗎?同樣你也需要每次都增加它。 – dublintech
@dublintech:我基於這個例子說明了Guava和JDK如何實現線程工廠。也有可能兩個線程同時提交一些任務,並且突然線程池需要創建兩個線程來滿足不斷增長的需求。種族情況可能會發生。感謝關於增加計數器的四個小費,固定。 –
如果您在提交任務運行時考慮了線程的名稱,那麼我建議使用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();
相關:http://stackoverflow.com/questions/3157852/should-threads-in-java-be-named-for-easier-debugging – 2012-10-24 20:22:53