1 创建线程池并提交一个任务
public class TerminalTest {
public static void main(String[] args) {
ExecutorService poolExecutor = Executors.newFixedThreadPool(5);
poolExecutor.execute(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
System.out.println("finish task 1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
2 提交任务的原理源码解读-核心代码
2.1 添加任务本质上是将一个Runnable对象传递进线程池,调用addWorker方法来创建work对象执行任务。
2.2 注意上面说的work对象是线程池内的一个内部类Worker的实例,这个实例有两个属性一个是线程thread,一个是Runable对象即提交的要执行的任务。
2.3 注意2.1内的addWorker方法作用是创建Worker对象并执行
2.4 Worker是实现了Runnable接口的,thread属性传递的Runnable参数是this,也就是说当上面图拿到Worker内的thread执行start方法时候就是运行Worker内的run方法
2.4 Worker内这个run方法内调用了runWorker方法传的是this(worker自己),这里要注意runWorker方法是线程池的,run方法是Worker这个内部类的。
3 runWorker方法
3.1 当前worker内绑定的线程执行worker内的Runnable代码,注意1127是一个循环
3.2 getTask方法
getTask()方法中如果take或者poll到了任务,就会到上图的去调用任务的run方法,注意此时代码所在的线程仍是最开始的worker对象绑定的线程。