本文是在观看 深入分析java线程池的实现原理 后,对其中讲述的方法虽然了解其功能及大致步骤,但是对其中具体实现依然不太明白,所以查看其中的源码,并对源码的操作步骤进行说明.至于方法功能,使用等等.请参考上面的文章
主要研究的类为
- java.util.concurrent.ThreadPoolExecutor
- java.util.concurrent.FutureTask
源码版本为jdk1.8.0_91
ThreadPoolExecutor
首先需要了解 AtomicInteger
类型的 ctl
变量,这个变量以32位二进制的方式描述俩种信息
- 前三位表示线程池的状态
- RUNNING(111) 接受新任务并处理排队的任务
- SHUTDOWN(000) 不接受新任务,而是处理排队的任务
- STOP(011) 不接受新任务,不处理排队的任务和中断进行中的任务
- TIDYING(100) 所有任务已终止,workerCount 为零, 线程过渡到状态 TIDYING 将运行 terminate() 钩子方法
- TERMINATED(110) terminated() 已完成
- 后二十九位表示当前工作的线程数(
[0,(2^29)-1]
)
任务执行有俩种方法,其中 execute
方法由 ThreadPoolExecutor
提供submit
方法继承自 AbstractExecutorService
的实现
java.util.concurrent.ThreadPoolExecutor#execute(Runnable command)
1 | public void execute(Runnable command) { |
java.util.concurrent.ThreadPoolExecutor#addWorker(Runnable firstTask, boolean core)
1 | private boolean addWorker(Runnable firstTask, boolean core) { |
java.util.concurrent.ThreadPoolExecutor#runWorker(Worker w)
1 | final void runWorker(Worker w) { |
java.util.concurrent.ThreadPoolExecutor#getTask()
1 | private Runnable getTask() { |
java.util.concurrent.AbstractExecutorService#submit(Callable task)
1 | public <T> Future<T> submit(Callable<T> task) { |
FutureTask
存在一个 int
类型的 state
变量,改变量的至可能为以下六种
- NEW 初始状态
- COMPLETING 任务执行完成,即将更改为NORMAL或EXCEPTIONAL状态
- NORMAL 任务执行完成(无异常)
- EXCEPTIONAL 任务执行完成(有异常)
- CANCELLED 任务取消
- INTERRUPTING 中断进行中
- INTERRUPTED 中断完成
状态变更存在以下几种顺序
NEW -> COMPLETING -> NORMAL
NEW -> COMPLETING -> EXCEPTIONAL
NEW -> CANCELLED
NEW -> INTERRUPTING -> INTERRUPTED
java.util.concurrent.FutureTask#get()
1 | public V get() throws InterruptedException, ExecutionException { |
java.util.concurrent.FutureTask#report(int s)
1 | private V report(int s) throws ExecutionException { |
java.util.concurrent.FutureTask#awaitDone(boolean timed, long nanos)
1 | private int awaitDone(boolean timed, long nanos) |
在 java.util.concurrent.ThreadPoolExecutor#runWorker(Worker w)
方法中任务执行是直接调用 run
方法,因为FutureTask
需要获取任务运行结果及收集异常,所以对 run
方法进行了包装
在构造 FutureTask 时参数允许接受 Callable 与 Runnable 类型,实际上他会将 Runnable 类型转为一个 Callable 类型,然后使用 call()
方法进行调用
java.util.concurrent.FutureTask#run()
1 | public void run() { |
java.util.concurrent.FutureTask#set(V v)
1 | protected void set(V v) { |
setException(Throwable t)
方法请参考 set(V v)
java.util.concurrent.FutureTask#finishCompletion()
1 | private void finishCompletion() { |