是否有一個ExecutorService
實現行爲像一個具有以下特徵的線程池?執行器服務,擴展線程,然後排隊任務
- 總是有至少X個活動線程。
- 如果提交任務並且所有活動線程都忙,則會啓動一個新線程,最多爲Y個線程。
- 如果一個任務被提交併且所有的Y線程都忙,那麼這個任務就排隊了。
- 如果沒有提交新的任務,池會縮減回X個活動線程。
相當標準的線程池行爲。你會認爲ThreadPoolExecutor
會處理這個問題,但如果超過10個任務被提交
executorService = new ThreadPoolExecutor(
2, 10, // min/max threads
60, TimeUnit.SECONDS, // time of inactivity before scaling back
new SynchronousQueue<Runnable>()); // task queue
會拋出異常。切換到LinkedBlockingQueue
永遠不會超過這兩個最小線程,除非您限制像new LinkedBlockingQueue<Runnable>(20)
這樣的大小,在這種情況下,將有兩個線程處理1-20個任務,2-10個線程處理21-30個任務,超過30個任務。不漂亮。與此同時,固定線程池永遠不會縮減非活動線程。
因此,爲了得到我所追求的,我可以使用其他種類的BlockingQueue
還是擺弄我錯過的其他設置?是否還有另一個ExceutorService
實現更適合(哪個?),還是通過覆蓋ThreadPoolExecutor
的方法來滾動我自己?
我不認爲一些不活躍的線程會做多大的危害? – JonasCz
我也不理解你對非活動線程的關注。 Afaik,他們坐在那裏休息,幾乎沒有間接費用。 –