2011-04-23 119 views
1

我使用了corePoolSize = maxPoolSize = queueSize = 15在threadpoolexcecutor正在執行的任務的線程池很少線程

每一個傳入的請求產卵7級的任務,一個ThreadPoolExecutor與此線程池來執行。

即使每個單獨任務在被安排時間不到3秒,整個請求也需要更長的時間。

我懷疑係統沒有排隊的線程和任務。

我記錄了每個傳入請求的以下信息。

getActiveCount() 
getLargestPoolSize() 
getPoolSize() 
getQueue().size() 

我注意到系統沒有低於線程。

getPoolSize and getLargestPoolSize values is constant at 15 - 這是預期的。

getQueue().size()始終爲0 - 因此沒有任務正在排隊。

getActiveCount()值總是在1-2之間。

爲什麼池中的其他線程不工作?

是「getActiveCount() - 返回正在執行任務的線程的大致數量。」正確的API使用?

回答

1

我不太瞭解Java的線程池,但通常您只會創建儘可能多的線程,因爲您的機器具有可用的核心(或硬件線程)。如果你在雙核心機器上運行,2個活動線程是一個明智的價值。

+1

這並非完全正確。例如,如果您正在進行緩慢的外部服務,例如其他API,那麼您可以輕鬆支持比可用內核數量多得多的線程。 – Zeki 2011-04-23 17:46:24

+0

是的,我的7個任務實際上是7個外部服務電話。所以我猜,當線程被阻塞在I/O(在我的情況下是網絡)時,它應該處理更多的線程。但似乎不是。 – Ravi 2011-04-24 17:10:42

2

正如@Thomas所說,池正按照需要創建線程,因此如果您只給予池1-2的任務一次執行,它將只有1-2個線程處於活動狀態。如果你想讓它更繁忙,你需要一次性向它提供更多的任務。

+0

每個傳入的請求都會在緊密的循環中添加7個任務。 – Ravi 2011-04-24 17:14:43

+0

除非您的任務不平凡,否則可能無法創建新線程。如果在緊密循環之後立即得到Active(),你會看到什麼? – 2011-04-24 18:36:33

0

您是否嘗試過在eclipse中的調試模式下運行此操作?它通常顯示所有分配的線程以及它們的狀態。 我懷疑在你的情況下,發生下面的情況:你有線程池和線程池已分配線程數來處理你提交到它的任務。但是,一旦線程池中的任何特定線程完成了提交到線程池的任務,它就不會終止。相反,它會將其狀態切換爲BLOCKED或WAITING(我不記得確定其中哪一個),並等待下一個任務傳遞到此特定線程中進行處理。