當我有這個代碼的應用程序:空閒線程在Java執行程序中執行CPU執行時間嗎?
Executors.newFixedThreadPool(4);
,但我從來沒有使用此線程池。空閒線程會消耗CPU時間嗎?如果是這樣 - 爲什麼?
當我有這個代碼的應用程序:空閒線程在Java執行程序中執行CPU執行時間嗎?
Executors.newFixedThreadPool(4);
,但我從來沒有使用此線程池。空閒線程會消耗CPU時間嗎?如果是這樣 - 爲什麼?
的javadoc狀態:
創建一個可重用不受限制的隊列操作螺紋固定數量的線程池。在任何時候,最多nThreads線程都將被激活處理任務。
這可能導致假設:我們不完全知道。但正如另一個答案清楚地發現的那樣 - 我們可以知道,而實現實際上完全是懶惰的。因此:
ExecutorService service = Executors.newFixedThreadPool(4);
甚至不會導致很多設置。實施可以自由地等待任何發生。
service.submit(...
發生。
另一方面,該線程池可能(理論上)立即創建,並且還可以創建4個OS線程。如果後面是這種情況,那麼所有這些線程都會閒置,因此它們應該消耗任何CPU資源,而不是而不是。當然,正如Elliott正確指出的那樣,創建池和(可能)創建1到4個線程的初始步驟需要CPU活動。
當然:線程是操作系統資源。所以即使他們「只存在」也什麼都不做;他們有這個「成本」。再次,它可能依賴於操作系統,如果這可能會變成一個問題(如達到一些「最大數量的現有線程」限制)。
最後:因爲這讓我好奇,我看了一下當前的Java8源代碼(從newFixedThreadPoo()和ThreadPoolExcecutor()下降到DefaultThreadFactory)。如果我沒有弄錯:那些構造函數只有準備線程創建。
因此:「當前」實現是「完全」懶惰;如果你真的只打電話newFixedThreadPool()
而不使用生成的ExecutorService ... 沒有發生(根據創建的新線程)。
不,這些線程是懶惰創建的,或者是「按需」。作爲the documentation(重點礦山)說:
點播建設
默認情況下,即使核心線程最初創建和啓動只有當新的任務到達
的Java提供方法來覆蓋此默認值並允許急於創建,即prestartCoreThread
和prestartAllCoreThreads
。
一旦線程被實際創建,空閒的人(通常)不會佔用CPU時間,沒有理由讓他們在覈心調度時,他們沒有工作要做。
但是,他們仍然會堅持一些內存,因爲他們的堆棧和內存不足。
不是。空閒線程不消耗CPU時間(儘管啓動池需要一定的時間,並且會消耗內存)。 –
@ElliottFrisch如果我沒有弄錯,調用這個方法不會真的**啓動池。看到我的答案。 – GhostCat
只是想知道:有什麼東西阻止你接受答案嗎? – GhostCat