在我的項目中,我構建了一個Java執行框架,它接收來自客戶端的工作請求。工作(不同規模)被分解爲一組任務,然後排隊等待處理。有單獨的隊列來處理每種類型的任務,每個隊列都與一個ThreadPool相關聯。 ThreadPools的配置方式使得引擎的整體性能最佳。工作/任務竊取ThreadPoolExecutor
這種設計可以幫助我們有效地平衡請求,而大型請求不會佔用系統資源。然而,有時當某些隊列爲空並且它們各自的線程池閒置時,解決方案變得無效。
爲了讓這個更好,我正在考慮實現一個工作/任務竊取技術,以便重載隊列可以從其他ThreadPools獲得幫助。但是,這可能需要實現我自己的執行程序,因爲Java不允許將多個隊列與ThreadPool關聯,並且不支持工作竊取概念。
閱讀Fork/Join,但這看起來不適合我的需求。任何建議或替代方法來構建此解決方案可能會非常有幫助。
感謝 安迪
您應該考慮如何保持所有CPU忙碌。如果您正在充分利用您的CPU,那麼您的某些線程是否空閒並不重要。 – 2012-04-14 12:45:50
如果您的線程池擁有與cpus一樣多的線程,則即使所有其他線程池都處於空閒狀態,任何單獨的線程池都可以「竊取」所有cpus。 – 2012-04-14 12:50:53
@PeterLawrey - 這是真的,但如果有很多池,那麼如果所有池中的所有線程同時工作,則性能可能會很差。 – jtahlborn 2012-04-14 12:55:33