簡體   English   中英

有沒有一種方法可以確定newFixedThreadPool隊列中有多少可運行對象?

[英]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 提供了四個預定義的處理程序策略:

  1. 在默認的ThreadPoolExecutor.AbortPolicy ,處理程序在拒絕時會拋出運行時RejectedExecutionException
  2. ThreadPoolExecutor.CallerRunsPolicy ,調用執行自己的線程運行任務。 這提供了一種簡單的反饋控制機制,將降低新任務提交的速度。
  3. ThreadPoolExecutor.DiscardPolicy ,簡單地刪除了無法執行的任務。
  4. ThreadPoolExecutor.DiscardOldestPolicy ,如果未關閉執行程序,則將丟棄工作隊列開頭的任務,然后重試執行(該操作可能再次失敗,導致重復執行此操作)。

可以定義和使用其他種類的RejectedExecutionHandler類。 這樣做需要格外小心,尤其是在設計策略僅在特定容量或排隊策略下工作時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM