2015-09-25 35 views
8

我對我的應用程序運行負載測試,以查找支持計劃負載所需的最大線程數。Java CachedThreadPool vs FixedThreadPool

我已使用ExecutorServiceCachedThreadPool,以便線程根據負載動態創建。現在我知道使用getLargestPoolSize()的最大線程數的值。

我應該用FixedThreadPool(maxValue)替換CachedThreadPool,以避免(Integer.MAX_VALUE)線程創建行爲CachedThreadPool

建議他們每個人的利弊。

+0

你指的是什麼「*大線程創建行爲*」?你的意思是,如果沒有可用的緩存線程池將創建一個新線程的事實?如果是這樣,最好的問題是「*我是否會介意我的線程被阻塞,如果我碰巧在所有工作線程都不可擦除的情況下提交另一個任務?」請記住,緩存的線程池會在一段時間後破壞線程。雖然你知道最大數量,那麼平均數是多少?如果最大值爲10,但平均值爲4,那麼保持10個線程不會有意義。 –

+0

大的線程創建行爲 - 如果有人發送太多的請求,cachedThreadPool不應該創建Integer.MAX_VALUE線程 – MIK

+0

找到幾個更好的答案@ https://stackoverflow.com/questions/17957382/fixedthreadpool-vs-cachedthreadpool-the-lesser-的,二,罪惡/ –

回答

4

Java中高速緩存線程池和固定線程池之間最重要的區別是高速緩存線程池對其產生和使用的線程數沒有上限。哪一個是首選取決於你想要的縮放行爲。

緩存線程池的主要優點是,即使您有大量未預料到的任務要執行,線程也會立即開始執行。例如,您的業務需求可能會在幾個月或幾年內增加,並且您的應用程序可能會轉移到更強大的機器上,並且使用緩存線程池將允許通過使用增加的可用處理能力來滿足增加的需求,而無需更改代碼。這可能是一個優勢,因爲一旦應用程序在服務數月或數年後,人們可能無法很好地記住代碼,以便將線程限制標識爲可以改變以提高性能的參數。

固定線程池的主要優點是線程數量受到更嚴格的控制。這有助於防止軟件安裝的其他部分 - 無論是在應用程序中還是在其他應用程序中 - 如果此應用程序在短時間內收到大量任務,將無法滿足處理能力的要求。此外,降低了運行到操作系統線程限制的風險,降低了當進程需要產生線程並且無法執行時可能導致的軟件崩潰風險。