2015-03-13 116 views
6

his famous concurrency book,Goetz的表明可使用优化线程池大小

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

W/C是等待到计算的比率来计算线程池中的最佳数目。我想开发一个自定义Executor,它将使用ThreadPoolExecutor.setCorePoolSize()调整工作线程数量,但我不知道如何计算WC比率。假设ThreadPool是我的应用程序使用的唯一一个,我该如何计算该比率?

有没有办法跟踪工作线程在等待/睡眠上花费多少时间? 还是有解决这个问题的任何实施?

+0

请注意,应用程序的工作人员可能会改变他们的行为,比如开始等待http响应时间更长或更短,我希望他们动态调整,从而跟踪每个人随着时间的推移...像jvisualvm这样做... – vach 2015-03-13 13:55:42

+0

isn' t Thread.getState()你需要什么? – 2015-03-13 13:58:42

+0

那么我知道getState(),但我不知道如何使用它?我应该查询所有工作线程的某个预定时间,还是有一种方法来订阅状态更改......或者哪些状态是在W下进行的我假设两个睡眠等待阻塞都是......因此我需要一些建议。 .. – vach 2015-03-13 14:04:11

回答

1

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

这个类包含等

getBlockedCount()

返回的总次数,与此ThreadInfo相关的线程阻塞进入或重新进入一个监视器方法。

getBlockedTime()

返回与此ThreadInfo相关的线程被阻塞进入或因为线程争用监视被启用重新进入监视器的近似累积时间(以毫秒为单位)。

+0

所以我需要得到JMX bean并开始监控我的线程?答案是? – vach 2015-03-13 19:14:06

+0

我了解情况的方式是,我需要运行一个单独的计划任务,它将使用线程mxbean收集线程信息并开始调整我的线程池 – vach 2015-03-13 19:17:48

+1

将此处放在稍后查找http://nadeausoftware.com /用品/ 2008/04/java_tip_how_list_and_find_threads_and_thread_groups – vach 2015-03-13 19:36:12