2015-03-13 164 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