2016-03-07 112 views
2

我有一個需求,我需要處理當前的現場演出一些任務。 這是一個計劃任務,每分鐘運行一次。Executors.newFixedThreadPool() - 這個操作有多昂貴

在一分鐘之內,可以有任意數量的現場表演(雖然數量不能說大,約最多10)。 所有現場演出需要完成超過20項功能。或者說有20個工人班,那裏都有工作

讓我們來說說第一個功能,有5個節目,然後幾分鐘後顯示減少到2,然後幾分鐘後再顯示增加到7

目前,我做這樣的事情,

int totalShowsCount = getCurrentShowsCount(); 
ExecutorService executor = Executors.newFixedThreadPool(showIds.size()); 

上述語句被執行的每一分鐘。

問題陳述

1)上面的操作多少昂貴是..?。在每個給定的分鐘創建fixedThreadPool。

2.)我可以做什麼來優化我的解決方案,我應該使用固定線程池,例如(10),也許3或5或6或任何數量的線程在任何給定的時間使用。

我可以在工作人員級別創建一個固定線程池,並維護它並使用該線程池: 。

僅供參考,使用Java8,如果有更好的方法可用。

+0

你爲什麼每分鐘都重新創建一個新的'ExecutorService'?是不是可以實施一次(在啓動時)並且每次重複使用它? – Spotted

+0

@斑點我有20名工人,每個工人都有自己的工作,我想爲所有工人創造獨立的泳池 - 我應該..?如果我爲所有工人創建共用池,可能是我工作人員消耗更多線程的情況,所有工人都會每分鐘啓動一次,可能會出現這樣一種情況,即我的一名工人沒有任何線程。 –

+0

爲什麼不使用單個可調整大小的池('Executors.newCachedThreadPool')? – apangin

回答

3

上述操作需要多少錢.. ??在每個給定的分鐘創建fixedThreadPool。

創建線程池是一個相對昂貴的操作,可能需要幾十毫秒。你不希望每秒鐘都這麼做。

第二個是電腦的永恆,如果你有一個36核心的機器,它可以在這段時間內執行多達1000億條指令。一分鐘是非常非常長的一段時間,如果你每分鐘只做一件事,你甚至可以每分鐘重新啓動一次JVM,並且仍然可以獲得合理的吞吐量。

我該如何優化我的解決方案,我應該使用固定的線程池,例如(10),也許3或5或6或任何數量的線程在任何給定分鐘使用。

可能,這取決於你在做什麼。沒有大多數分析,你可以肯定地說。注意:如果您使用的是parallelStream(),如果不是,您應該看看是否可以,您可以使用內置的ForkJoinPool.commonPool()而不需要創建另一個池。但是,這又取決於你在做什麼。