2017-05-05 179 views
3

當我有這個代碼的應用程序:空閒線程在Java執行程序中執行CPU執行時間嗎?

Executors.newFixedThreadPool(4); 

,但我從來沒有使用此線程池。空閒線程會消耗CPU時間嗎?如果是這樣 - 爲什麼?

+7

不是。空閒線程不消耗CPU時間(儘管啓動池需要一定的時間,並且會消耗內存)。 –

+0

@ElliottFrisch如果我沒有弄錯,調用這個方法不會真的**啓動池。看到我的答案。 – GhostCat

+0

只是想知道:有什麼東西阻止你接受答案嗎? – GhostCat

回答

2

javadoc狀態:

創建一個可重用不受限制的隊列操作螺紋固定數量的線程池。在任何時候,最多nThreads線程都將被激活處理任務。

這可能導致假設:我們不完全知道。但正如另一個答案清楚地發現的那樣 - 我們可以知道,而實現實際上完全是懶惰的。因此:

ExecutorService service = Executors.newFixedThreadPool(4); 

甚至不會導致很多設置。實施可以自由地等待任何發生。

service.submit(... 

發生。

另一方面,該線程池可能(理論上)立即創建,並且還可以創建4個OS線程。如果後面是這種情況,那麼所有這些線程都會閒置,因此它們應該消耗任何CPU資源,而不是而不是。當然,正如Elliott正確指出的那樣,創建池和(可能)創建1到4個線程的初始步驟需要CPU活動。

當然:線程是操作系統資源。所以即使他們「只存在」也什麼都不做;他們有這個「成本」。再次,它可能依賴於操作系統,如果這可能會變成一個問題(如達到一些「最大數量的現有線程」限制)。

最後:因爲這讓我好奇,我看了一下當前的Java8源代碼(從newFixedThreadPoo()ThreadPoolExcecutor()下降到DefaultThreadFactory)。如果我沒有弄錯:那些構造函數只有準備線程創建。

因此:「當前」實現是「完全」懶惰;如果你真的只打電話newFixedThreadPool()而不使用生成的ExecutorService ... 沒有發生(根據創建的新線程)。

1

不,這些線程是懶惰創建的,或者是「按需」。作爲the documentation(重點礦山)說:

點播建設

默認情況下,即使核心線程最初創建和啓動只有當新的任務到達

的Java提供方法來覆蓋此默認值並允許急於創建,即prestartCoreThreadprestartAllCoreThreads


一旦線程被實際創建,空閒的人(通常)不會佔用CPU時間,沒有理由讓他們在覈心調度時,他們沒有工作要做。

但是,他們仍然會堅持一些內存,因爲他們的堆棧和內存不足。