https://blog.csdn.net/Hellowenpan/article/details/115869474
1、当一个任务提交到线程池,首先会被封装成一个 worker 对象(不管是否立即执行该任务)
2、根据线程池中的线程数量,线程池等判断该任务(worker)是被立即执行 或 进入等待队列 或 拒绝
• 如果一个任务被立即执行,则立即执行该 worker • 如果一个任务是被添加到等待队列中了,但此时线程池中中有空闲线程了,便会从等待队列中取出该 worker 并执行。 • 如果一个任务被拒绝了,则不会被执行。
此时执行该任务的 worker 调用的其实就是 Worker
里的 run 方法。
③、根据该任务的执行情况:1、正常执行 2、发生异常 将结果封装到 outcome 变量中!
要先理解这三者之间的关系,后面才能理解为什么任务执行的时候先调用worker 的run方法,然后再调用的futuretask的run方法,最后再调用的 任务的run方法!
// 任务提交后会被封装为一个 worker节点
private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
/** Thread this worker is running in. Null if factory fails. */
final Thread thread;
// 具体任务的引用会被记录到这个属性上(即将 FutureTask 对象封装到该属性上)
Runnable firstTask;
Worker(Runnable firstTask) {
// 将任务赋值给 firstTask 属性
this.firstTask = firstTask;
// 这儿是Worker的关键所在,使用了线程工厂创建了一个线程。传入的参数为当前worker
this.thread = getThreadFactory().newThread(this);
}
/** Delegates main run loop to outer runWorker */
// 代理
// 【当线程执行任务的时候就会执行这个方法】
public void run() {
// 执行 worker的run 方法
runWorker(this);
}
// 执行任务
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
while (task != null || (task = getTask()) != null) {
// 加锁执行任务
w.lock();
if ((runStateAtLeast(ctl.get(), STOP) || (Thread.interrupted() &&
runStateAtLeast(ctl.get(), STOP))) && !wt.isInterrupted())
wt.interrupt();
try {
// 执行run方法之前
beforeExecute(wt, task);
Throwable thrown = null;
try {
// 【 调用run方法运行任务。这里其实是调用的 futureTask 的 run 方法。 】
task.run();
} catch (Exception x) {
// 省略.....
} finally {
afterExecute(task, thrown);
}
} finally {
// help GC
task = null;
// 将已执行的任务数量++
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;
} finally {
processWorkerExit(w, completedAbruptly);
}
}
}
3、FutureTask.run()