[英]Is there a way to determine how many runnables are in a newFixedThreadPool Queue?
我正在點火
Executors.newFixedThreadPool(100);
在一個主程序中,生產者投入工作的速度快於消費者所能承受的速度。 有沒有辦法查看newFixedThreadPool使用的基礎無界隊列中排隊了多少個項目?
使用java.util.concurrent.ThreadPoolExecutor#getTaskCount
獲取線程池中計划任務的數量。 但是,請注意,這只是一個近似值,可能並不精確。
如果要解決生產者生產任務比生產者快的問題,請限制基礎隊列的大小,並在創建java.util.concurrent.ThreadPoolExecutor
時傳入RejectedExecutionHandler
的實現之一。 請參閱ThreadPoolExecutor
的文檔中的以下代碼段:
被拒絕的任務
當執行器已關閉時,並且在
Executor
對最大線程和工作隊列容量使用有限范圍且已飽和時,將拒絕在方法execute(java.lang.Runnable)
提交的新任務。 在任一情況下,執行方法調用RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)
其的方法RejectedExecutionHandler
。 提供了四個預定義的處理程序策略:
- 在默認的
ThreadPoolExecutor.AbortPolicy
,處理程序在拒絕時會拋出運行時RejectedExecutionException
。- 在
ThreadPoolExecutor.CallerRunsPolicy
,調用執行自己的線程運行任務。 這提供了一種簡單的反饋控制機制,將降低新任務提交的速度。- 在
ThreadPoolExecutor.DiscardPolicy
,簡單地刪除了無法執行的任務。- 在
ThreadPoolExecutor.DiscardOldestPolicy
,如果未關閉執行程序,則將丟棄工作隊列開頭的任務,然后重試執行(該操作可能再次失敗,導致重復執行此操作)。可以定義和使用其他種類的
RejectedExecutionHandler
類。 這樣做需要格外小心,尤其是在設計策略僅在特定容量或排隊策略下工作時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.