1. 程式人生 > >Java併發程式設計札記-(六)JUC執行緒池-01概述

Java併發程式設計札記-(六)JUC執行緒池-01概述

前面的例子中總是需要執行緒時就建立,不需要就銷燬它。但頻繁建立和銷燬執行緒是很耗資源的,在併發量較高的情況下頻繁建立和銷燬執行緒會降低系統的效率。執行緒池可以通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。
參考JDK1.8中的相關類,畫出下圖。
MarkdownPhotos/master/CSDNBlogs/concurrency/0201/threadPool.png
(此圖不是十分準確,有些類實現了兩個介面,這裡只展示出了一個)
本章只是簡單地介紹下它們,在以後的文章中會選一些最重要的來學習。

Executor
此介面提供一種將任務提交與每個任務將如何執行的機制分離開來的方法。它只提供了execute(Runnable)這麼一個方法,用於執行已提交的Runnable任務。

ExecutorService


繼承了Executor介面,用於提交一個用於執行的Runnable任務、試圖停止所有正在執行的活動任務,暫停處理正在等待的任務、執行給定的任務。

AbstractExecutorService
提供了ExecutorService的預設實現。

ThreadPoolExecutor
提供一個可擴充套件的執行緒池實現,是最出名的“執行緒池”。

ForkJoinPool
JDK1.7中新增的一個執行緒池,與ThreadPoolExecutor一樣,同樣繼承了AbstractExecutorService。ForkJoinPool是Fork/Join框架的兩大核心類之一。與其它型別的ExecutorService相比,其主要的不同在於採用了工作竊取演算法(work-stealing):所有池中執行緒會嘗試找到並執行已被提交到池中的或由其他執行緒建立的任務。這樣很少有執行緒會處於空閒狀態,非常高效。這使得能夠有效地處理以下情景:大多數由任務產生大量子任務的情況;從外部客戶端大量提交小任務到池中的情況。

ScheduledExecutorService&ScheduledThreadPoolExecutor
ScheduledExecutorService繼承了ExecutorService,可安排在給定的延遲後執行或定期執行命令。
ScheduledThreadPoolExecutor繼承了ThreadPoolExecutor,實現了ScheduledExecutorService。

CompletionService&ExecutorCompletionService
CompletionService介面是將生產新的非同步任務與使用已完成任務的結果分離開來的服務。生產者利用submit()提交要執行的任務。使用者利用take()獲取並移除已完成的任務的返回值,並按照完成這些任務的順序處理它們的結果。
通常,CompletionService 依賴於一個單獨的 Executor 來實際執行任務,在這種情況下,CompletionService 只管理一個內部完成佇列。ExecutorCompletionService 類提供了此方法的一個實現。此類將那些完成時提交的任務放置在可使用take()訪問的佇列上。

Callable&Future
Callable介面類似於Runnable,兩者作用都是定義任務。不同的是,被執行緒執行後,Callable可以返回結果或丟擲異常。而Runnable不可以。Callable的返回值可以通過Future來獲取。

未完待續。。。

本文就先講到這裡,想了解Java併發程式設計更多內容請參考: