构造函数
1 | public ThreadPoolExecutor(int corePoolSize, |
解释一下这几个参数
corePoolSize:线程池核心线程数量;线程池刚刚创建的时候线程池中有0个线程在执行任务,当任务提交到线程池时,如果当前线程数量小于corePoolSize,就会创建新的线程执行任务;如果当前线程已经等于corePoolSize,就会把任务放在workQueue任务队列中。
maximumPoolSize:线程池最大线程数量;当workQueue任务队列已满,此时如果添加新的任务,线程池就会创建新的线程来执行任务,但是最大不会超过maximumPoolSize
keepAliveTime:线程池中线程的数量大于corePoolSize时,空闲线程的超时回收时间。如果 allowCoreThreadTimeOut为true 则核心线程也会超时回收。
threadFactory:创建线程的工厂。
handler:拒绝策略,当workQueue已满而且线程数达到maximumPoolSize,无法处理新来的任务时的拒绝策略。
##
addWorker方法
1 | private boolean addWorker(Runnable firstTask, boolean core) { |
在里面完成了状态检查、新建任务、执行任务等一系列动作。可以看到上面创建线程的流程和上面画的图一样。
接下来看t.start();到底做了什么
1 | Worker(Runnable firstTask) { |
在Worker 的构造函数里面可以看到 Worker.thread 是使用自己来构造的一个线程,所以上面的t.start() 所执行的就是work的run方法。也就是runWorker
runWorker
1 | final void runWorker(Worker w) { |
可以看到这个方法一直在执行我们提交的任务的run() 方法,第一次会执行创建这个线程的任务的run方法,后面会执通过getTask()方法重队列里面的任务。