java線程池核心API源碼詳細分析
概述
線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創(chuàng)建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優(yōu)先級運行,并處于多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創(chuàng)建另一個輔助線程但線程的數(shù)目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。
jdk中當然也提供了一些操作線程池的API。
java中操作線程池的api位于java.util.concurrent;包中。
常見的核心接口和實現(xiàn)類包括Executor接口、ExecutorService接口、ScheduledExecutorService接口、ThreadPoolExecutor實現(xiàn)類、ScheduledThreadPoolExecutor實現(xiàn)類等。
Executor接口
最上層的接口,定義了執(zhí)行任務的execute()方法。

ExecutorService接口
繼承了Executor接口,擴展了Callable、Future、關閉方法。

ScheduledExecutorService接口
繼承了ExecutorService接口,增加了定時任務相關的方法。

ThreadPoolExecutor實現(xiàn)類
基礎、標準的線程池實現(xiàn)。
ScheduledThreadPoolExecutor實現(xiàn)類
繼承了ThreadPoolExecutor,實現(xiàn)了ScheduledExecutorService中定時任務相關的方法。
他們之間的繼承實現(xiàn)關系圖如下:

源碼分析
下面對Executor接口、ExecutorService接口、ScheduledExecutorService接口、ThreadPoolExecutor實現(xiàn)類、ScheduledThreadPoolExecutor實現(xiàn)類這幾個核心api的源碼進行分析。
Executor
public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}
Executor是最上層的接口,該接口提供了一個execute()方法,用于執(zhí)行指定的Runnable任務。
ExecutorService
ExecutorService接口繼承至Executor接口,擴展了Callable、Future、關閉等方法。
public interface ExecutorService extends Executor
定義的方法
//啟動有序關閉,先前已經(jīng)執(zhí)行的的任務將會繼續(xù)執(zhí)行,但不會執(zhí)行新的任務。
void shutdown();
//嘗試停止所有主動執(zhí)行的任務,停止等待任務的處理,并返回正在等待執(zhí)行的任務列表。
List<Runnable> shutdownNow();
//如果這個Executor已被關閉,則返回 true 。
boolean isShutdown();
//如果所有任務在關閉后完成,則返回true 。 請注意, isTerminated從不true ,除非shutdown或shutdownNow先被執(zhí)行。
boolean isTerminated();
//阻止所有任務在關閉請求完成后執(zhí)行,或發(fā)生超時,或當前線程中斷,以先到者為準。
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
//提交值返回任務以執(zhí)行,并返回代表任務待處理結果的Future。
<T> Future<T> submit(Callable<T> task);
//提交一個可運行的任務執(zhí)行,并返回一個表示該任務的Future。Future的get方法將在成功完成后返回給定的結果。
<T> Future<T> submit(Runnable task, T result);
提交一個可運行的任務執(zhí)行,并返回一個表示該任務的Future。Future的get方法將在成功完成后返回null。
Future<?> submit(Runnable task);
//執(zhí)行給定的任務,返回持有他們的狀態(tài)和結果的所有完成的Future列表。
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
//執(zhí)行給定的任務,返回在所有完成或超時到期時持有其狀態(tài)和結果的Future列表
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
//執(zhí)行給定的任務,返回一個成功完成的結果(即沒有拋出異常),如果有的話。 正常或異常退出后,尚未完成的任務將被取消。
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
//執(zhí)行給定的任務,返回一個已經(jīng)成功完成的結果(即,不拋出異常),如果有的話。
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
ScheduledExecutorService
ScheduledExecutorService接口繼承了ExecutorService接口,增加了定時任務相關的方法。
public interface ScheduledExecutorService extends ExecutorService
方法
/* 創(chuàng)建并執(zhí)行在給定延遲后啟用的單次操作。
參數(shù)
command - 要執(zhí)行的任務
delay - 從現(xiàn)在開始延遲執(zhí)行的時間
unit - 延時參數(shù)的時間單位
結果
表示任務等待完成,并且它的ScheduledFuture get()方法將返回 null。
*/
public ScheduledFuture<?> schedule(Runnable command,
long delay, TimeUnit unit);
/* 創(chuàng)建并執(zhí)行在給定延遲后啟用的ScheduledFuture。
參數(shù)類型
V - 可調用結果的類型
參數(shù)
callable - 執(zhí)行的功能
delay - 從現(xiàn)在開始延遲執(zhí)行的時間
unit - 延遲參數(shù)的時間單位
結果
一個可用于提取結果或取消的ScheduledFuture
*/
public <V> ScheduledFuture<V> schedule(Callable<V> callable,
long delay, TimeUnit unit);
/*在初始延遲之后周期性的執(zhí)行command。
參數(shù)
command - 要執(zhí)行的任務
initialDelay - 延遲第一次執(zhí)行的時間
period - 連續(xù)執(zhí)行之間的時期
unit - initialDelay和period參數(shù)的時間單位
結果
一個ScheduledFuture代表待完成的任務,其 get()方法將在取消時拋出異常
*/
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
/**
創(chuàng)建并執(zhí)行在給定的初始延遲之后首先啟用的定期動作,隨后在一個執(zhí)行的終止和下一個執(zhí)行的開始之間給定的延遲。 如果任務的執(zhí)行遇到異常,則后續(xù)的執(zhí)行被抑制。 否則,任務將僅通過取消或終止執(zhí)行人終止。
參數(shù)
command - 要執(zhí)行的任務
initialDelay - 延遲第一次執(zhí)行的時間
delay - 一個執(zhí)行終止與下一個執(zhí)行的開始之間的延遲
unit - initialDelay和delay參數(shù)的時間單位
結果
一個ScheduledFuture代表待完成的任務,其 get()方法將在取消時拋出異常
*/
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
ThreadPoolExecutor
ThreadPoolExecutor是一個基礎、標準的線程池實現(xiàn)。
ThreadPoolExecutor中提供了四種構造函數(shù)以創(chuàng)建線程池。
參數(shù)的定義如下:

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
}
/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
ScheduledThreadPoolExecutor
public class ScheduledThreadPoolExecutor
extends ThreadPoolExecutor
implements ScheduledExecutorService
繼承了ThreadPoolExecutor,實現(xiàn)了ScheduledExecutorService中定時任務相關的方法。


總結
到此這篇關于java線程池核心API源碼詳細分析的文章就介紹到這了,更多相關java中線程池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

