Java8 ThreadPoolExecutor线程池分析
一.构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {...}
上面是Java8 ThreadPoolExecutor最丰富的构造函数,参数如下:
1.corePoolSize:线程池中保留的线程数,即使它们是空闲的,除非设置了allowCoreThreadTimeOut,该参数默认为false;
2.maximumPoolSize:线程池中允许的最大线程数;
3.keepAliveTime:当线程数大于核心时,空闲线程等待新任务的最长时间,超时候空闲线程关闭;
4.unit:keepAliveTime的时间单位;
5.workQueue:在任务执行前用于保留任务的队列,通常称为等待队列;
6.threadFactory:创建新线程时使用的工厂类;
7.handler:达到任务队列容量,阻止任务执行时的处理类。
二.任务执行流程
为了使流程图中的逻辑易读,调整了原代码一些参数名称,参数类型则保持不变。
![p1](https://i-blog.csdnimg.cn/blog_migrate/86bef39558cd3f81075313ee16e458e3.png#pic_center)
三.任务执行分析
流程图中节点的分析:
1.execute:提交一个任务command;
2.addWordker:继续提交一个任务command;
3.new Worker():创建一个执行线程w;
4.workers.add:将线程w提交至线程池workers;
5.t.start:启动线程w;
6.Worker.run:线程w执行;
7.runWorker:继续线程w执行;
8.task=w.command:获取提交的任务command;
9.while:线程w轮询执行command;
10.comman.run:在线程w中执行任务command,由于调用的是command.run方法,所以不会启动新的线程;
11.processWorkerExit:当前没有任务执行时,线程w退出;
12.workers.remove(w):线程池workers删除线程w;
13.addWorker(null, false):提交null任务,如步骤2,保持核心线程数。