我們知道, 在Java中創(chuàng)建線程的代價是非常昂貴的, 需要JVM和OS的配置進(jìn)行大量的處理工作:
- 必須為線程堆棧分配和初始化大量的內(nèi)存塊, 其中至少包含1MB的棧內(nèi)存.
- 需要使用JNI系統(tǒng)調(diào)用, 以便在OS中創(chuàng)建和注冊本地線程.
Java委托操作系統(tǒng)線程處理Java線程
一般開發(fā)中, 我們不允許頻繁的創(chuàng)建和銷毀線程, 常用的阿里開發(fā)規(guī)范Java版
不允許開發(fā)人員自行顯示的創(chuàng)建線程, 應(yīng)采用線程池減少系統(tǒng)資源開銷.
線程池的好處
a. 提升性能
線程池能獨(dú)立的負(fù)責(zé)線程的創(chuàng)建, 維護(hù)和分配. 在執(zhí)行大量的異步任務(wù)時不需要自己創(chuàng)建線程, 而是交給線程池去調(diào)度. 線程池能使用空閑的線程執(zhí)行異步任務(wù), 最大限度的提高對已經(jīng)創(chuàng)建線程的復(fù)用性, 提升性能.
b. 線程管理
每個Java線程池都有線程的管理能力. 例: 任務(wù)數(shù)量, 空閑數(shù)量, 執(zhí)行時間等信息.
對線程進(jìn)行有效的管理, 提升異步任務(wù)的高效調(diào)度.
Java線程池架構(gòu)
1. Executor接口
異步任務(wù)的"執(zhí)行者"接口, Executor提供了一個execute()來執(zhí)行已經(jīng)提交的Runnable執(zhí)行目標(biāo)實(shí)例. Executor是作為執(zhí)行者的角色, 目的是提供一種將"任務(wù)提交者"和"任務(wù)執(zhí)行者"分開的機(jī)制, 它只有一個函數(shù)式方法:
public interface Executor {
void execute(Runnable var1);
}
2. ExecutorService
ExecutorService接口繼承自Executor, 它是異步任務(wù)的"執(zhí)行者服務(wù)"接口, 對外提供異步任務(wù)的接受者服務(wù). ExecutorService提供了接收"接收異步任務(wù)并轉(zhuǎn)交給執(zhí)行者"的方法.
public interface ExecutorService extends Executor {
/**
* 關(guān)閉執(zhí)行器, 主要有以下特點(diǎn):
* 1. 已經(jīng)提交給該執(zhí)行器的任務(wù)將會繼續(xù)執(zhí)行, 但是不再接受新任務(wù)的提交;
* 2. 如果執(zhí)行器已經(jīng)關(guān)閉了, 則再次調(diào)用沒有副作用.
*/
void shutdown();
/**
* 立即關(guān)閉執(zhí)行器, 主要有以下特點(diǎn):
* 1. 嘗試停止所有正在執(zhí)行的任務(wù), 無法保證能夠停止成功, 但會盡力嘗試(例如, 通過 Thread.interrupt中斷任務(wù), 但是不響應(yīng)中斷的任務(wù)可能無法終止);
* 2. 暫停處理已經(jīng)提交但未執(zhí)行的任務(wù);
*
* @return 返回已經(jīng)提交但未執(zhí)行的任務(wù)列表
*/
List<Runnable> shutdownNow();
/**
* 如果該執(zhí)行器已經(jīng)關(guān)閉, 則返回true.
*/
boolean isShutdown();
/**
* 判斷執(zhí)行器是否已經(jīng)【終止】.
* 僅當(dāng)執(zhí)行器已關(guān)閉且所有任務(wù)都已經(jīng)執(zhí)行完成, 才返回true.
* 注意: 除非首先調(diào)用 shutdown 或 shutdownNow, 否則該方法永遠(yuǎn)返回false.
*/
boolean isTerminated();
/**
* 阻塞調(diào)用線程, 等待執(zhí)行器到達(dá)【終止】狀態(tài).
*
* @return {@code true} 如果執(zhí)行器最終到達(dá)終止?fàn)顟B(tài), 則返回true; 否則返回false
* @throws InterruptedException if interrupted while waiting
*/
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
/**
* 提交一個具有返回值的任務(wù)用于執(zhí)行.
* 注意: Future的get方法在成功完成時將會返回task的返回值.
*
* @param task 待提交的任務(wù)
* @param <T> 任務(wù)的返回值類型
* @return 返回該任務(wù)的Future對象
* @throws RejectedExecutionException 如果任務(wù)無法安排執(zhí)行
* @throws NullPointerException if the task is null
*/
<T> Future<T> submit(Callable<T> task);
/**
* 提交一個 Runnable 任務(wù)用于執(zhí)行.
* 注意: Future的get方法在成功完成時將會返回給定的結(jié)果(入?yún)r指定).
*
* @param task 待提交的任務(wù)
* @param result 返回的結(jié)果
* @param <T> 返回的結(jié)果類型
* @return 返回該任務(wù)的Future對象
* @throws RejectedExecutionException 如果任務(wù)無法安排執(zhí)行
* @throws NullPointerException if the task is null
*/
<T> Future<T> submit(Runnable task, T result);
/**
* 提交一個 Runnable 任務(wù)用于執(zhí)行.
* 注意: Future的get方法在成功完成時將會返回null.
*
* @param task 待提交的任務(wù)
* @return 返回該任務(wù)的Future對象
* @throws RejectedExecutionException 如果任務(wù)無法安排執(zhí)行
* @throws NullPointerException if the task is null
*/
Future<?> submit(Runnable task);
/**
* 執(zhí)行給定集合中的所有任務(wù), 當(dāng)所有任務(wù)都執(zhí)行完成后, 返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表.
*
* 注意: 該方法為同步方法. 返回列表中的所有元素的Future.isDone() 為 true.
*
* @param tasks 任務(wù)集合
* @param <T> 任務(wù)的返回結(jié)果類型
* @return 任務(wù)的Future對象列表,列表順序與集合中的迭代器所生成的順序相同煮盼,
* @throws InterruptedException 如果等待時發(fā)生中斷, 會將所有未完成的任務(wù)取消.
* @throws NullPointerException 任一任務(wù)為 null
* @throws RejectedExecutionException 如果任一任務(wù)無法安排執(zhí)行
*/
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;
/**
* 執(zhí)行給定集合中的所有任務(wù), 當(dāng)所有任務(wù)都執(zhí)行完成后或超時期滿時(無論哪個首先發(fā)生), 返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表.
*/
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;
/**
* 執(zhí)行給定集合中的任務(wù), 只有其中某個任務(wù)率先成功完成(未拋出異常), 則返回其結(jié)果.
* 一旦正常或異常返回后, 則取消尚未完成的任務(wù).
*/
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;
/**
* 執(zhí)行給定集合中的任務(wù), 如果在給定的超時期滿前, 某個任務(wù)已成功完成(未拋出異常), 則返回其結(jié)果.
* 一旦正炒郏或異常返回后, 則取消尚未完成的任務(wù).
*/
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
3. AbstractExecutorService
AbstractExecutorService是一個抽象類, 它實(shí)現(xiàn)了ExecutorService接口.
AbstractExecutorService存在的目的是為ExecutorService中的接口提供默認(rèn)實(shí)現(xiàn)
4. ThreadPoolExecutor *
JDK所有線程池實(shí)現(xiàn)的父類, 它繼承于AbstractExecutorService抽象類.
ThreadPoolExecutor是JUC線程池的核心實(shí)現(xiàn)類. 線程的創(chuàng)建和終止需要很大的開銷, 線程池中預(yù)先提供了指定數(shù)量的可重用線程, 所以使用線程池會節(jié)省系統(tǒng)資源, 并且每個線程池都維護(hù)了一些基礎(chǔ)的數(shù)據(jù)統(tǒng)計, 方便線程的管理和監(jiān)控.
5. ScheduledExecutorService
ScheduledExecutorService是一個接口, 它繼承于ExecutorService. 它是一個可以完成“延時”和“周期性”任務(wù)的調(diào)度線程池接口, 其功能和Timer/TimerTask類似.
[Timer]Java定時工具類
6. ScheduledThreadPoolExecutor
繼承于ThreadPoolExecutor, 它提供了ScheduledExecutorService線程池接口中"延時執(zhí)行"和"周期執(zhí)行"等抽象調(diào)度方法的具體實(shí)現(xiàn). 類似于Timer, 但是在高并發(fā)程序中, ScheduledThreadPoolExecutor的性能要優(yōu)于Timer.
7. Executors
Executors是一個靜態(tài)工廠類, 它通過靜態(tài)工廠方法返回ExecutorService, ScheduledExecutorService等線程池示例對象, 這些靜態(tài)工廠方法可以理解為一些快捷的創(chuàng)建線程池的方法.