我有一个Java应用程序,重点关注并发性和可突发容量。这意味着它使用线程池来排队和执行事件。
所有这些线程池都是固定大小的,但是当应用程序部署在Linux(CentOS 5.5)服务器上时,我经常发现自己遇到了打开文件描述符限制。
根据我的统计,应用程序在加载时,任何时候都不应创建超过20个线程,但我的命中率为ulimit
1024。
有没有办法可以将这些线程追溯到创建它们的代码/池中?
答案 0 :(得分:5)
一个理智的线程池应该(至少可选)允许指定名称。
对于普通ThreadPoolExecutor
,您需要实现一个ThreadFactory
来正确命名线程。然后使用setThreadFactory()
使其使用您的实现。
您还可以使用Guava ThreadFactoryBuilder
并致电setNameFormat()
来预先构建该功能:
ThreadPoolExecutor myExecutor = ...;
ThreadFactory tf = new ThreadFactoryBuilder().setNameFormat("myExecutorThread-%d").build();
myExecutor.setThreadFactory(tf);