https://blog.csdn.net/Hellowenpan/article/details/115869474

五、线程池执行已提交的任务

1、当一个任务提交到线程池,首先会被封装成一个 worker 对象(不管是否立即执行该任务)

2、根据线程池中的线程数量,线程池等判断该任务(worker)是被立即执行 或 进入等待队列 或 拒绝

• 如果一个任务被立即执行,则立即执行该 worker • 如果一个任务是被添加到等待队列中了,但此时线程池中中有空闲线程了,便会从等待队列中取出该 worker 并执行。 • 如果一个任务被拒绝了,则不会被执行。

此时执行该任务的 worker 调用的其实就是 Worker 里的 run 方法。

③、根据该任务的执行情况:1、正常执行 2、发生异常 将结果封装到 outcome 变量中!

1、worker和futuretask和callable / runnable 的关系

要先理解这三者之间的关系,后面才能理解为什么任务执行的时候先调用worker 的run方法,然后再调用的futuretask的run方法,最后再调用的 任务的run方法!

image.png

image.png

2、Worker.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()