我在我的應用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)
。這是一個靜態變量。執行者服務多線程
corePoolsize
是10個主題。假設所有10個線程當前都在分配任務下運行。我想知道如果我再創建一個任務並嘗試運行它,會發生什麼情況。
我試過在我的系統中,但我看到的是任務運行時沒有任何問題。
我在我的應用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)
。這是一個靜態變量。執行者服務多線程
corePoolsize
是10個主題。假設所有10個線程當前都在分配任務下運行。我想知道如果我再創建一個任務並嘗試運行它,會發生什麼情況。
我試過在我的系統中,但我看到的是任務運行時沒有任何問題。
直接的Javadoc採取
如果有其他任務提交時的所有線程是活動的,他們將在隊列中等待,直到一個線程可用
當您提交時,新任務所有線程當前都處於活動狀態,它將以FIFO方式添加到隊列中,並在一個線程可用時處理。這個隊列是無限的,所以它可以容納的最大元素是Integer.MAX_VALUE
。
這在Javadoc的回答爲Executors.newFixedThreadPool
:
如果當所有線程是活動的其他任務提交,他們將在隊列中等待,直到一個線程可用。如果任何線程在關閉之前的執行期間由於失敗而終止,則如果需要執行後續任務,則將取代它。
您的系統通常具有多個處理器。 這就是爲什麼你無法看到任何區別。
即使您提到線程池爲10,線程實際上是由JVM均勻分配到系統中的所有處理器。 因此,用於存儲即將到來的任務的隊列永遠不會滿足只有10個線程。
我想;即使使用Integer.MAX_VALUE任務數量,等待隊列也不會完全加載,因爲多個處理器會佔用任務並在其中分配。
如果提交的新工作比他們能夠完成的更快? – tddmonkey
@Rashmi必須發送低負載任務,這就是爲什麼她無法看到任何區別。 – AnirbanDebnath
我想;即使使用Integer.MAX_VALUE任務數量,等待隊列也不會完全加載,因爲多個處理器會佔用任務並在其中分配。 – AnirbanDebnath
正如我已經評論你的答案,這使得工作完成得比他們提交的要快 – tddmonkey
@MrWiggles其他答案?爲什麼會做出這樣的假設?如果他們提交的工作沒有儘快完成,他們會被添加到隊列中,這就是我所說的。 – Tunaki