默認
這是一個固定大小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名單。
@ som-snytt沒問題,我會在正常工作時間向您挑戰。在這種情況下,監督是我的,謝謝你發現它。 – flavian
謝謝。無論如何,我不得不在早上8點起牀,讓孩子上學。凌晨4點總是模糊的時間。 –
有沒有辦法從當前上下文中獲取ThreadPoolExecutor? – Peter