2014-03-28 54 views

回答

23

默認

這是一個固定大小ThreadPool,其中有許多線程在機器上的處理器。合理的默認意味着它在大多數情況下都適用於大多數情況。

什麼是「好」的線程池

首先,要了解你只需要儘可能多的線程在機器上的內核是非常重要的。所有其他線程都被稱爲惡魔線程,它的全部功能都是通過隊列和執行來實現(在語言/庫級別)。

CachedThreadPool:許多短命/廉價任務

類型,你產卵大大取決於他們的平均執行的操作線程池。對於很多短暫的操作(比如數據庫查詢),你可以使用一個緩存線程池。

因爲每個單獨的任務相對便宜,但產生一個新線程很昂貴,所以最好用CachedThreadPool

FixedThreadPool:長時間運行/昂貴的任務

與上面的對比,對於非常昂貴的操作,你可能希望限制在同一時間運行的線程數量,由於種種原因:內存,性能等。

ForkJoinPool:分而治之

當你需要執行一個非常大的計算這種類型的池是有用的,但你可以把它分成更小的位個體勞動者CA n計算。

該列表會繼續顯示。底線,斯卡拉給你在所有上述之間的東西。具體來說,Scala會嘗試創建一個ForkJoinPool,如果第一個失敗,則默認爲ThreadPoolExecutor。

try { 
    new ForkJoinPool(
    desiredParallelism, 
    threadFactory, 
    uncaughtExceptionHandler, 
    true) // Async all the way baby 
} catch { 
    case NonFatal(t) => 
    System.err.println("Failed to create ForkJoinPool for the default ExecutionContext, falling back to ThreadPoolExecutor") 
    t.printStackTrace(System.err) 
    val exec = new ThreadPoolExecutor(
     desiredParallelism, 
     desiredParallelism, 
     5L, 
     TimeUnit.MINUTES, 
     new LinkedBlockingQueue[Runnable], 
     threadFactory 
    ) 
    exec.allowCoreThreadTimeOut(true) 
    exec 
} 

}

這裏的full名單。

+0

@ som-snytt沒問題,我會在正常工作時間向您挑戰。在這種情況下,監督是我的,謝謝你發現它。 – flavian

+0

謝謝。無論如何,我不得不在早上8點起牀,讓孩子上學。凌晨4點總是模糊的時間。 –

+0

有沒有辦法從當前上下文中獲取ThreadPoolExecutor? – Peter