2011-03-14 124 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