【Java併發】Executor框架
阿新 • • 發佈:2018-12-03
Executor框架
Executor框架結構
- 任務。包括被執行任務需要實現的介面:Runnable介面或Callable介面。
- 任務的執行。任務執行機制的核心介面Executor,以及繼承Executor的ExecutorService介面,以及實現了ExecutorService介面的兩個關鍵類:ThreadPoolExecutor和ScheduledThreadPoolExecutor
- 非同步計算的結果。包括介面Future和實現Future介面的FutureTask類。
ThreadPoolExecutor
FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
LinkedBlockingQueue是無界佇列,使用無界佇列會帶來如下影響:
- 當執行緒池的執行緒數達到corePoolSize後,新任務將在無界佇列中等待,因此執行緒池中的執行緒數不會超過corePoolSize。
- 由於1,使用無界佇列時maximumPoolSize將是一個無效引數
- 由於1,使用無界佇列時keepAliveTime將是一個無效引數
- 由於使用無界佇列,RejectedExecutionHandler將是一個無效引數
SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
SingleThreadExecutor的corePoolSize和maximumPoolSize都被設定為1。其他引數與FixedThreadPool相同。
newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
corePoolSize為0,maximumPoolSize為無界的,keepAliveTime為60秒,工作佇列為沒有容量的SynchronousQueue。
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor繼承自ThreadPoolExecutor。它主要用來給定的延遲之後執行任務,或者定期執行任務。
FutureTask
FutureTask除了實現Future介面外,還實現了Runnable介面。
FutureTask有3種狀態:
- 未啟動。FutureTask.run()方法還沒被執行之前。
- 已啟動。FutureTask.run()方法被執行的過程中。
- 已完成。FutureTask.run()方法執行完成後。
FutureTask的get和cancel的執行圖如下:
參考
- Java併發程式設計的藝術[書籍]