我們目前正試圖通過在我們的Java應用程序中使用多線程來調整性能。 我們有一個長時間運行的串行任務,我們想分割成多個CPU核心。Java線程池:有更多的更小的任務,或更大的批量更少的任務
基本上我們有100,000個物品/要做的事情。
我現在的問題是,是它更好地做到:
選項1(僞):
for(i = 0; i < 100000; i++){
threadpool.submit(new MyCallable("1 thing to do"))
}
這將增加10萬個可運行/可調用的線程池的隊列(當前的LinkedBlockingQueue)
或者是它更好地做到: 選項2(僞)
for(i = 0; i < 4; i++){
threadpool.submit(new MyCallable("25000 things to do"))
}
我們已經嘗試過了選項1,但我們沒有注意到任何性能改進,儘管我們可以清楚地看到多個線程工作得像瘋了一樣,也使用了4個CPU內核。但我的感覺是,由於許多任務,選項1有一些開銷。我們還沒有嘗試過選項2,但我的感覺是,它可以加快速度,因爲開銷較小。我們基本上將這個列表分成4個大塊,而不是100000個單個項目。
對此有何看法?
感謝
這不會有一個普遍的答案;這取決於「要做的事情」的性質。你必須嘗試。 –
感謝您的幫助。我知道沒有普遍的答案,但我想了解每種方法。我們的用例是計算密集型的,而不是I/O限制。我們現在要實施選項2並比較結果。 – Christoph