2014-03-26 28 views
3

我知道線程池是一件好事,因爲它可以重用線程,從而節省創建新線程的成本。但我的問題是,使用線程池有什麼缺點?在哪種情況下使用線程池不如僅使用單個線程?使用線程池有什麼缺點嗎?

回答

0

當你不打算停止使用線程時,Theads會更好。例如在無限循環中。當執行許多不同時發生的任務時,線程池是最好的。特別是當任務很短時,使用相同線程的開銷和清晰度更大。

6

在哪種情況下使用線程池不如使用單個線程?

我能想到的唯一情況是當你有一個線程只需要爲你的程序的整個生命執行一個任務。像後臺線程附加到永久緩存或其他東西。這是我唯一一次直接分叉線程而不是使用ExecutorService。即使如此,使用Executor.newSingleThreadExecutor()也可以。

當然,只要您需要多個線程來執行任務,線程池是保證。 ExecutorService代碼的作用是減少編寫管理線程所需的代碼量。可讀性和代碼可維護性的提高是一個巨大的勝利。

0

這取決於你要利用線程池的情況。例如,如果您的系統不需要並行執行任務,則線程池將不起作用。它將爲不會出現的工作準備好不必要的線程。在這種情況下,您仍然可以使用SingleThreadExecutor。檢查這個鏈接,如果你沒有它可以澄清你的話:Thread Pool Pattern

1

除了格雷的答案。

其他用例是,如果您使用線程本地或使用線程作爲某種散列表或線程的有狀態自定義實現的關鍵。在這種情況下,即使特殊任務失敗,您也必須在使用線程完成特定任務時清理狀態。否則,可能會出現一些驚喜:使用具有某種狀態的線程的下一個任務可能開始運行錯誤。

0

如果在其上運行的任務通過阻塞隊列交換信息,那麼線程池的大小是有危險的 - 這可能導致線程匱乏:What is starvation?。好的規則是從不在線程池上運行的任務中使用阻塞操作。

2

線程池僅適用於需要較少時間才能完成的操作。線程池線程不適合長時間運行的操作,因爲它很容易導致線程匱乏。

如果你需要你的線程有一個特定的優先級,那麼線程池線程是不適合的。

您有導致線程長時間阻塞的任務。線程池擁有最大數量的線程,因此大量阻塞的線程池線程可能會阻止任務啓動。

1

這裏有一堆不同的答案。我認爲其中一個原因是問題不完整。你問的是「使用線程池的缺點」,但你沒有說,缺點與比較起來是什麼?

線程池解決了一個特定的問題。還有其他問題,其中「線程」或「線程」是解決方案的一部分,但「線程池」不是。在一個多處理器系統上,「線程池」通常是問題的答案,如何在多處理器系統上實現許多短暫的CPU密集型任務的並行執行。

即使在單處理器上,線程也可用於其他目的。例如,我問的關於任何長時間運行的線程的第一個問題是「它等待什麼」。線程是組織必須等待不同種類事件的程序的極好工具。不過,您不會爲此使用線程池。