3 回答

TA貢獻1827條經驗 獲得超9個贊
我認為文檔很好地解釋了這兩個功能的區別和用法:
newFixedThreadPool
創建一個線程池,該線程池重用在共享的無邊界隊列上運行的固定數量的線程。在任何時候,最多nThreads個線程都是活動的處理任務。如果在所有線程都處于活動狀態時提交了其他任務,則它們將在隊列中等待,直到某個線程可用為止。如果在關閉之前執行過程中由于執行失敗導致任何線程終止,則在執行后續任務時將使用新線程代替。池中的線程將一直存在,直到明確將其關閉。
newCachedThreadPool
創建一個線程池,該線程池根據需要創建新線程,但是將在先前構造的線程可用時重用它們。這些池通常將提高執行許多短期異步任務的程序的性能。如果可用,執行調用將重用以前構造的線程。如果沒有可用的現有線程,則將創建一個新線程并將其添加到池中。六十秒內未使用的線程將終止并從緩存中刪除。因此,保持空閑時間足夠長的池不會消耗任何資源。請注意,可以使用ThreadPoolExecutor構造函數創建具有相似屬性但不同細節(例如,超時參數)的池。
在資源方面,它newFixedThreadPool將使所有線程一直運行,直到明確終止它們為止。在newCachedThreadPool60秒鐘內未使用的線程被終止并從緩存中刪除。
在這種情況下,資源消耗將在很大程度上取決于情況。例如,如果您有大量長時間運行的任務,我建議您使用FixedThreadPool。至于CachedThreadPool,文檔說:“這些池通常可以提高執行許多短期異步任務的程序的性能”。

TA貢獻1780條經驗 獲得超5個贊
如果您不擔心可調用/可運行任務的無限隊列,則可以使用其中之一。正如布魯諾建議,我也喜歡newFixedThreadPool到newCachedThreadPool這兩者之間。
但ThreadPoolExecutor的 規定相比,它更靈活的功能newFixedThreadPool或newCachedThreadPool
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
好處:
您可以完全控制BlockingQueue的大小。與前兩個選項不同,它不是無限的。由于系統中出現意外的動蕩,未完成的可調用/可運行任務的大量堆積,我不會出現內存不足的錯誤。
您可以實施自定義拒絕處理策略,也可以使用以下策略之一:
默認情況下ThreadPoolExecutor.AbortPolicy,處理程序在拒絕時引發運行時RejectedExecutionException。
在中ThreadPoolExecutor.CallerRunsPolicy,調用執行自己的線程運行任務。這提供了一種簡單的反饋控制機制,將降低新任務提交的速度。
在中ThreadPoolExecutor.DiscardPolicy,簡單地刪除了無法執行的任務。
在中ThreadPoolExecutor.DiscardOldestPolicy,如果未關閉執行程序,則將丟棄工作隊列開頭的任務,然后重試執行(這可能再次失敗,從而導致重復執行此操作)。
您可以為以下用例實現自定義線程工廠:
設置更具描述性的線程名稱
設置線程守護程序狀態
設置線程優先級
添加回答
舉報