2010-09-07 105 views
0

我在主程序發射了有沒有辦法確定newFixedThreadPool隊列中有多少個runnables?

Executors.newFixedThreadPool(100); 

和製片人在工作快於消費者能跟上抽。有沒有辦法查看newFixedThreadPool使用的基礎無界隊列中排隊的項目數量?

+0

其值得注意的是,如果你的任務是CPU密集型你可能會發現,你有核的數量相匹配的線程池的性能會更好。但是,如果你的任務是IO綁定的(我懷疑他們是),你可能會發現緩存線程池最適合。 – 2010-09-07 06:28:22

+0

喜彼得,是任務都IO勢必使頭HTTP請求 – James 2010-09-07 18:37:16

回答

4

使用java.util.concurrent.ThreadPoolExecutor#getTaskCount得到的線程池中計劃任務數。但是,請注意,這只是一個近似值,可能並不準確。

如果要解決生產者生產任務比消費者更快的問題,請限制底層隊列的大小,並在創建java.util.concurrent.ThreadPoolExecutor時通過RejectedExecutionHandler的實現之一。見從ThreadPoolExecutor的文檔下面的代碼片段:

拒絕任務的當執行程序已關閉

的方法execute(java.lang.Runnable)提交的新任務將被拒絕,並且也當Executor使用的有限範圍最大線程數和工作隊列容量都是飽和的。在任一情況下,執行方法調用其RejectedExecutionHandlerRejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)方法。提供四個預定義的處理程序策略:

  1. 在默認ThreadPoolExecutor.AbortPolicy,處理程序拒絕時拋出一個運行時RejectedExecutionException
  2. ThreadPoolExecutor.CallerRunsPolicy,調用執行自身的線程運行的任務。這提供了一個簡單的反饋控制機制,可以減慢提交新任務的速度。
  3. ThreadPoolExecutor.DiscardPolicy,不能執行僅僅是被丟棄的任務。
  4. ThreadPoolExecutor.DiscardOldestPolicy,如果執行程序沒有關閉,在工作隊列頭部的任務將被丟棄,然後執行重試(可再次失敗,導致此重複。)

可以定義和使用其他種類的類。這樣做需要特別注意,特別是在政策旨在僅在特定容量或排隊策略下工作時。

+0

的感謝!我可以檢查我的taskCount是否超過一定的尺寸,只是睡覺,直到消費者趕上? – James 2010-09-07 05:43:32

相關問題