ThreadPoolExecutor是一个服务(`ExecutorService`),用来执行被提交过来的任务(task)的。通常上,会把任务放到从线程池中的线程去执行。 而ThreadPoolExecutor可以有不同的线程池可以使用。通过不同的创建方法:`Executors.new****ThreadPool()` - newCachedThreadPool 没有边界,每次都新增一个线程 - newFixedThreadPool 固定线程大小 - newSingleThreadExecutor 单线程的线程池 #### core / maximum pool size 当一个新的任务提交过来后(`execute(runnable)`),会根据`MaximumPoolSize`和`CorePoolSize`两个参数的设置来决定任务的去向。 如果当前的正在运行的线程数大于`CorePoolSize`而且小于`MaximunPoolSize`且当前的**等待队列满了**,就会创建一个线程。 也就是说,如果把这两个参数设置成一样的话,就相当于创建了一个FixedThreadPool。而如果把`MaximumPoolSize`设置的很大的话,就相当于 创建了一个CachedThreadPool。 #### Keep-alive times 线程的存活时间,线程在没有工作的时候,会在经过这么后被释放。如果被设置成很大数的话,很久才能回收资源。不能为零。 ### 拒绝策略 如果core pool size 和 maximum pool size 和 队列都满了,需要对刚加入的新任务进行处理。有几种处理方式。 1. 直接在`execute()`的这个线程执行任务 2. 抛出异常`RejectedExecutionException` 3. 丢弃这个任务。 4. 将最久(队列头处的那个)的一个线程丢弃。 这是提供的方式,也可以自己实现`RejectedExecutionHandler`接口。 ``` java new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { } } ``` ### 状态变换 整个生命周期里,在Running、Stop、Shutdown、Tiddying、Terminated之间转换。 ![状态机](https://someonedeng-1253259777.cos.ap-guangzhou.myqcloud.com/blog%2Fimage%2FthreadPoolExetutor%E7%8A%B6%E6%80%81%E8%BD%AC%E6%8D%A2.png) ### 内部类 #### worker 用来执行task的。Service的`private boolean addWorker(Runnable firstTask, boolean core)`根据状态创建worker,并执行。