2011-03-14 222 views
0

我有一個重點關注併發性和可突發容量的java應用程序。這意味着它使用線程池來排隊和執行事件。Java線程創建跟蹤

所有這些線程池都是固定大小的,但當應用程序部署在Linux(CentOS 5.5)服務器上時,我總是發現自己碰到了打開的文件描述符限制。

要我計數,應用程序,當負載下,不應在任何一個時間創造超過20個線程,但我創下了1024

ulimit有什麼辦法,我可以跟蹤這些線程回到創建它們的代碼/池?

回答

5

一個健全的線程池應至少(可選)允許指定名稱。

對於正常的ThreadPoolExecutor,你需要實現一個ThreadFactory來適當地命名這些線程。然後使用setThreadFactory()使它使用你的實現。

您還可以使用GuavaThreadFactoryBuilder並調用setNameFormat()獲得該功能的預建:

ThreadPoolExecutor myExecutor = ...; 
ThreadFactory tf = new ThreadFactoryBuilder().setNameFormat("myExecutorThread-%d").build(); 
myExecutor.setThreadFactory(tf); 
+0

非常有用的,謝謝。我創建了一個簡單的'ThreadFactory',它使用一個名字作爲它的構造函數,並將問題縮小到第三方庫,該庫使用了一個無限制的,並且是一個懶洋洋的,如果有的回收線程池。 – Martin 2011-03-14 17:15:43