2013-05-29 50 views
3

可以請某人告訴我一個真實的例子,它可以方便地使用這個工廠方法而不是其他方法?使用方便的例子Executors.newSingleThreadExecutor()

newSingleThreadExecutor

公共靜態的ExecutorService newSingleThreadExecutor()

創建一個使用單個worker線程的 無界隊列操作執行器。 (但是請注意,如果單個線程關閉前的執行期間終止 由於故障,一個新的人會 如果需要執行後續任務,取代它的位置。)的任務是 保證順序地執行,並且不超過一個任務在任何給定時間將爲 有效。與其他等效 的newFixedThreadPool(1)返回的執行程序保證不會是 可重構使用其他的線程。

在此先感謝。

回答

12

請有人告訴我一個真實的例子,它使用[newSingleThreadExecutor()工廠方法]而不是其他方法很方便嗎?

我假設你問的是何時使用單線程線程池而不是固定線程池或緩存線程池。

我使用單線程執行程序時,我有很多任務運行,但我只想要一個線程來執行它。這當然與使用1的固定線程池相同。通常這是因爲我們不需要它們並行運行,它們是後臺任務,我們不希望佔用太多系統資源(CPU,內存,IO)。我想處理CallableRunnable對象的各種任務,因此ExecutorService是最優的,但我需要的只是一個線程來運行它們。

例如,我有一些計時器任務,我彈簧注入。我有兩種任務,我的「短期」任務在單個線程池中運行。即使系統中有幾百個線程,也只有一個線程可以執行它們。他們執行諸如檢查磁盤空間,清理日誌,轉儲統計數據等日常任務。對於時間要求嚴格的任務,我運行在緩存線程池中。

另一個例子是我們有一系列的合作伙伴整合任務。它們不需要很長時間,而且運行頻率很低,我們不希望它們與其他系統線程競爭,因此它們可以在單線程執行程序中運行。

第三個例子是,我們有一個有限狀態機,其中每個狀態的增變器發生作業從一個狀態到另一個,並在單個線程池被登記爲Runnable。儘管我們有數百個增變器,但是在任何一個時間點只有一個任務是有效的,因此爲任務分配多個線程是沒有意義的。

+0

爲什麼你只想要一個線程來做到這一點? – Rollerball

+1

因爲我們不希望它們並行運行並消耗太多@Rollerball的CPU資源。我已經添加了另一個顯示這個的例子。 – Gray

+0

非常感謝,確實如此。 – Rollerball

0

當您需要一個輕量級服務時,它會很有幫助,這隻會方便推遲任務執行,並且您希望確保只有一個線程用於作業。

2

Executors.newSingleThreadExecutor()Executors.newFixedThreadPool(1)之間的差異很小,但在設計庫API時可能會有所幫助。如果您向庫的用戶公開返回的ExecutorService,並且僅當執行程序使用單個線程(任務不是線程安全的)時庫才能正常工作,則最好使用Executors.newSingleThreadExecutor()。否則,你的庫的用戶可以通過這樣打破它:

ExecutorService e = myLibrary.getBackgroundTaskExecutor(); 
((ThreadPoolExecutor)e).setCorePoolSize(10); 

,這是不可能的Executors.newSingleThreadExecutor()

1

除了已經提到的原因之外,當您希望訂購保證時,您希望使用單線程執行程序,即您需要確保提交的任何任務總是按提交順序發生。