我一起實現我處理管道的最佳方式摔跤。生產者/消費者工作隊列
我的飼料生產工作提高到一個BlockingQueue的。在消費者方面,我輪詢隊列,將我在Runnable任務中獲得的內容包裝起來,並將其提交給ExecutorService。
while (!isStopping())
{
String work = workQueue.poll(1000L, TimeUnit.MILLISECONDS);
if (work == null)
{
break;
}
executorService.execute(new Worker(work)); // needs to block if no threads!
}
這並不理想;當然,ExecutorService有自己的隊列,所以實際發生的事情是我總是完全耗盡我的工作隊列並填充任務隊列,隨着任務完成,任務隊列逐漸清空。
我意識到,我可以在生產端排隊的任務,但我真的不想這樣做 - 我喜歡我的工作隊列爲啞弦的間接/隔離;這真的不是生產者的任何事情會發生在他們身上。強制生產者排隊Runnable或Callable打破抽象,恕我直言。
但我想共享的工作隊列代表當前處理狀態。如果消費者沒有跟上,我希望能夠阻止生產者。
我喜歡用執行人,但我覺得我打他們的設計。我可以部分喝Kool-ade,還是必須喝它?我是否在抵制排隊任務方面出錯? (我懷疑我可以將ThreadPoolExecutor設置爲使用1任務隊列並覆蓋它的執行方法來阻止而不是拒絕隊列滿,但這種感覺很糟糕。)
建議?
謝謝;我之前的實現很像這樣,儘管它只是使用了ThreadFactory--一旦你將它減少到一組固定的線程,這些線程都試圖耗盡工作隊列,那麼使用ExecutorService就沒有多大意義。我切換到ExecutorService以便利用更可調的線程池,其語義是「查找可用的現有工作線程(如果存在的話),如果有必要,創建一個線程,如果它們空閒,就殺掉它們。」 –
Executors.newCachedThreadPool()將做類似的事情。您也可以真正調整ThreadPoolExecutor本身的池策略。你在追求什麼? – Kevin
這就是這個想法......如果我願意使用它的任務工作隊列,它可以完全按照我喜歡的方式進行調整。我真正想要的是從執行程序中挖掘出線程池的智慧,並實現我自己的線程池客戶端,但它並不是真正爲此設置的。 –