优化线程池大小

7

他著名的并发书籍中,Goetz建议可以使用以下方法来计算线程池中的最佳线程数:

N threads = N CPU * U CPU * (1 + W/C)

"W/C"代表等待计算比率。我想开发一个自定义的Executor,使用ThreadPoolExecutor.setCorePoolSize()来调整工作线程数量,但我不知道如何计算WC比率。假设这个ThreadPool是应用程序唯一使用的,我该如何计算这个比率?
有没有一种方法可以跟踪工作线程花费在等待/休眠上的时间?或者有没有解决这个问题的实现?"

请注意,应用程序工作者的行为可能会发生变化,例如开始等待更长或更短的http响应时间。我希望它们能够动态调整,因此可以随着时间跟踪每个人的W/C...就像jvisualvm一样。 - vach
你需要的不是 Thread.getState() 吗? - Andrei Nikolaenko
如果您在VisualVM中看到,它可以跟踪所有运行时间、等待时间、停车时间等等...不确定如何仅使用getState实现这一点...我认为这里涉及到JMX... - vach
目前我只知道一种方法,就是在循环中检查线程状态。因为这很有趣,所以我将尝试进行研究。 - Andrei Nikolaenko
脑海中可能会浮现一个快速而可能不好的解决方案,即将wait()方法包装起来,这样当任何线程调用该包装方法时,它也会向订阅者发出等待状态的信号。 - Andrei Nikolaenko
显示剩余2条评论
1个回答

1

http://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadInfo.html

这个类包含像下面这样的方法: getBlockedCount() 返回与此ThreadInfo相关联的线程阻塞以进入或重新进入监视器的总次数。 getBlockedTime() 返回与此ThreadInfo相关联的线程自启用线程争用监视器以来,阻塞以进入或重新进入监视器的近似累计经过时间(以毫秒为单位)。

所以我需要获取JMX bean并开始监视我的线程吗?那就是答案了吗? - vach
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - vach
1
把这个放在这里以便日后查找 http://nadeausoftware.com/articles/2008/04/java_tip_how_list_and_find_threads_and_thread_groups - vach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接