我有一種情況,我期望添加到線程池比處理更快。我不認爲一個無限的隊列將是一個好主意,因爲如果不加限制,隊列中的數據可能會增加以吞噬所有的內存。鑑於此,我試圖確定一個ThreadPoolExecutor的正確設置。ThreadPoolExecutor配置
我的第一個想法是一個固定的線程池,帶有直接切換和調用者運行失敗策略。但是我不知道這是否會影響吞吐量(因爲每次調用者運行策略被調用時,線程池任務可能會完成並閒置一段時間)。
另一個想法是固定線程池與ArrayBlockingQueue,但我其實不確定的行爲。我希望這意味着Executor更喜歡在小於coreThread大小的情況下創建線程,然後隊列,如果隊列已滿,則會阻止等待隊列獲取空間。但在這裏閱讀文檔:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html
它似乎更喜歡創建線程高達corePoolSize,再加入到隊列中,如果隊列已滿,它會嘗試創建線程高達maxThreads(同作爲這種情況下的coreThreads),否則它將運行失敗策略。
有人可以澄清上述情況的行爲?並且還建議這種特殊情況下的最佳設置(我的一個建議或其他可能更好的建議)?
對於你的用例,我建議你測試一下。什麼最好取決於你想要維持的吞吐量以及每個任務的延遲。一個線程池可以很容易地處理每秒一百萬個任務的順序(只要任務很簡單)。如果速度太快,你有選擇減緩製片人的速度嗎? –
消費者正在向web服務發佈數據,而生產者只是從文件中讀取記錄。所以希望你能明白爲什麼製片人速度快,消費者速度慢。如果我讓製作人繼續添加到隊列中,我會耗盡內存。所以我希望有一種方法可以很好地配置ThreadPoolExecutor來爲我執行限制(就像在我的第一個示例中CallerRunsPolicy是一個粗略的限制)。理想情況下,有一種方法可以使生產者塊等待隊列中的空間,當使用最大線程並且隊列已滿時。 – Kevin
只要隊列長度超過某個長度,我就會暫停生產者。 (這是等待工作的長度)這樣你可以確定它永遠不會太長。 –