在java中,直接使用線程來異步的執行任務,線程的每次建立與銷燬須要必定的計算機資源開銷。每一個任務建立一個線程的話,當任務數量多的時候,則對應的建立銷燬開銷會消耗大量的資源,這種策略最終可能會使處於高負荷狀態的應用崩潰。java
Java中的線程,即便工做單元,也是執行機制。從JDK5開始,把工做單元與執行機制分離開來。編程
- 工做單元:Runnable 和 Callable
- 執行機制:Executor 框架
任務服務器
任務的執行
執行機制的核心接口-Executor,以及實現Executor接口的ExecutorService,
Executor框架 中有兩個關鍵類實現了ExecutorService:多線程
ThreadPoolExecutor併發
線程池的實現類,執行被提交的線程、任務(Callable/Runnable 接口的實現類中的run()方法)
ScheduledThreadPoolExecutor框架
給定延遲或按期的執行任務(Callable/Runnable 接口的實現類中的run()方法)、命令。比Timer 更加靈活,強大。
異步執行的結果(返回值)異步
主要成員: ThreadPoolExecutor(線程池)、ScheduldThreadPoolExecutor、Runnable接口、Future<V>接口、Callable<V>接口 以及 Executors工具類。
ThreadPoolExecutor
一般使用Executors 建立,Executors能夠建立三種類型的ThreadPoolExecutor:SingleThreadExecuto、FixedThreadPool、CachedThreadPool工具
FixedThreadPool 建立固定線程數,適用於限制當前線程數量時,適用於負載較重的服務器。
Executor建立使用的API:spa
public static ExecutorService newFixedThreadPool(int nThreads); public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory);
SingleThreadExecutor 建立單個線程,任意時間點不會有多個線程是活動的,適用於須要保證順序執行各任務的時候。
Executors建立API:操作系統
public static ExecutorService newSingleThreadPool(); public static ExecutorService newSingleThreadPool(ThreadFactory threadFactory);
CachedThreadPool 根據須要建立新線程,大小無界的線程池,適用於執行大量短時間的異步任務時,或負載較輕的服務器。
Executors建立API:
public static ExecutorService newCachedThreadPool(); public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory);
ScheduledThreadPoolExecutor
使用Executors工廠類建立,Executors能夠建立兩種類型的ScheduldThreadPoolExecutor
ScheduledThreadPoolExecutor 包含若干個線程,適用於多個線程執行週期任務,同時限制執行的線程數量。
Executors 建立固定個數線程ScheduledThreadPoolExecutor 的API:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize); public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);
SingleThreadScheduledExecutor 之包含一個線程,適用於單個後臺線程執行定時任務,同時保證順序執行各個任務。
Executors 建立單個線程SingleScheduledExecutor 的API:
public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize); public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize, ThreadFactory threadFactory);
Future 接口
與其實現類FutureTask用於表示異步計算的結果。Runnable/Callable接口提交(submit)給ThreadPoolExecutor或者ScheduledThreadPoolExecutor時候,返回值爲FutureTask對象、實現類Future接口的對象。
<T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task);
Runnable 和Callable 接口
均可以被線程池執行,Runnable 無返回值,Callable 有返回值。
Runnable能夠使用工廠類Executors將其封裝爲Callble
Executors 對應API以下:
//將返回的Callable對象提交給線程池返回FutureTask對象,調用FutureTask.get(),返回null public static Callable<Object> callable(Runnable task); //同上提交,FutureTask.get(),返回result對象。 public static Callable<Object> callable(Runnable task, T result);
《Java併發編程的藝術》 -方騰飛 魏鵬 程曉明 著