2011-05-17 85 views
4

我有一個固定的線程池,在任何時候(有一個隊列)運行7個併發線程,我想把它變成一個只運行7個併發作業的預定線程池,但可以排隊/時間表更多。固定線程池和預定線程池之間的Java差異

閱讀該文檔並沒有真正幫助我..

newFixedThreadPool

公共靜態的ExecutorService的newFixedThreadPool(INT來確定nthreads)

創建一個可重用操作一組固定的線程的線程池關閉 一個共享的無界隊列。如果任何線程在關閉之前的執行期間由於失敗 而終止,則如果 需要執行後續任務,則新的線程將取代它。

參數: 來確定nthreads - 線程池中返回數量: 新創建的線程池

newScheduledThreadPool

公共靜態ScheduledExecutorService的的newScheduledThreadPool(INT corePoolSize)

創建一個線程池,可以安排命令在給定的之後運行延遲或定期執行。

參數: corePoolSize - 保留在池中的線​​程數,即使它們處於空閒狀態。返回: 新創建的預定線程池

我不明白的是,corePoolSize和nThreads是一樣的東西嗎?預定的線程池是否是真正的固定線程池的子集,這意味着我可以使用調度的線程池作爲可以排隊延遲任務的固定線程池?

+0

你能否詳細說明爲什麼你想要固定線程池以外的東西?您是否閱讀過[ScheduledExecutorService]的javadoc(http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html)? – 2011-05-17 22:06:08

+0

我目前正在使用FixedThreadPool,但希望能夠在給定延遲後安排任務。例如,從現在開始的一小時內安排任務。以及能夠像我今天所做的那樣立即執行。 – 2011-05-17 22:08:44

+1

它可能被稱爲一個Executors.newFixedScheduledThreadPool(n),但這是很多字母:/ – 2011-05-17 22:17:03

回答

3

是的,它們基本上是一樣的東西,只是增加了調度功能。 ScheduledThreadPoolExecutor甚至擴展了ExecutorService(ThreadPoolExecutor)的默認實現。

nThreads和corePoolSize是要生成的線程數。對於固定執行者來說,它總是一樣的。在其他實現中,它在min(corePoolSize)和max(maxPoolSize)之間變化。

+0

我想盡可能多,但必須確保。 – 2011-05-17 23:50:41

1

是的,它在JDK5-6中以這種方式工作。雖然在原則上ScheduledExecutorService的界面上池大小的問題保持沉默,它的實際執行中JDK中使用,使用一個固定的池:

Class ScheduledThreadPoolExecutor

雖然這個類從 的ThreadPoolExecutor繼承,幾 繼承的調整方法不是 對它有用。特別是,因爲 它充當使用 corePoolSize線程和無界的 隊列的固定大小的池,因此對maximumPoolSize 的調整沒有有用的影響。

顯然,如果您使用由應用程序框架或不同供應商提供的ScheduledExecutorService的不同實現,則可能不成立。

+0

我看到了評論,這實際上是把我扔了。謝謝! – 2011-05-17 23:50:59

0

newScheduledThreadPool方法用於創建正好n個線程的線程池,無論它們是空閒還是正在運行。 int參數指定線程的數量。

該方法的newFixedThreadPool是用於創建正是 n個線程一個線程池,無論是閒置或運行。固定線程池的大小根據活動任務的數量而變化。