2015-12-02 98 views
0

我在我的應用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)。這是一個靜態變量。執行者服務多線程

corePoolsize是10個主題。假設所有10個線程當前都在分配任務下運行。我想知道如果我再創建一個任務並嘗試運行它,會發生什麼情況。

我試過在我的系統中,但我看到的是任務運行時沒有任何問題。

回答

1

直接的Javadoc採取

如果有其他任務提交時的所有線程是活動的,他們將在隊列中等待,直到一個線程可用

2

當您提交時,新任務所有線程當前都處於活動狀態,它將以FIFO方式添加到隊列中,並在一個線程可用時處理。這個隊列是無限的,所以它可以容納的最大元素是Integer.MAX_VALUE

這在Javadoc的回答爲Executors.newFixedThreadPool

如果當所有線程是活動的其他任務提交,他們將在隊列中等待,直到一個線程可用。如果任何線程在關閉之前的執行期間由於失敗而終止,則如果需要執行後續任務,則將取代它。

+0

我想;即使使用Integer.MAX_VALUE任務數量,等待隊列也不會完全加載,因爲多個處理器會佔用任務並在其中分配。 – AnirbanDebnath

+0

正如我已經評論你的答案,這使得工作完成得比他們提交的要快 – tddmonkey

+0

@MrWiggles其他答案?爲什麼會做出這樣的假設?如果他們提交的工作沒有儘快完成,他們會被添加到隊列中,這就是我所說的。 – Tunaki

-1

的Javadoc

在任何時候,在最 「來確定nthreads」 線程將積極處理任務。

可能是您之前執行的任何任務由於某種異常而終止。

+0

爲什麼投下了? – PyThon

+0

這絕不會回答OP的問題。他們特別想知道當所有10個線程都忙碌時發生了什麼,並且您提交了另一個任務 – tddmonkey

+0

@MWWiggles - 但是她提供的數據不正確,如果已經有10個線程正在執行,附加任務如何啓動它們的執行。 – PyThon

-1

您的系統通常具有多個處理器。 這就是爲什麼你無法看到任何區別。

即使您提到線程池爲10,線程實際上是由JVM均勻分配到系統中的所有處理器。 因此,用於存儲即將到來的任務的隊列永遠不會滿足只有10個線程。

我想;即使使用Integer.MAX_VALUE任務數量,等待隊列也不會完全加載,因爲多個處理器會佔用任務並在其中分配。

+0

如果提交的新工作比他們能夠完成的更快? – tddmonkey

+0

@Rashmi必須發送低負載任務,這就是爲什麼她無法看到任何區別。 – AnirbanDebnath