文章目录
一、核心类
- 顶级接口Executor
- ExecutorService实现Executor
- ThreadPoolExecutor间接实现ExecutorService
- Executors实现类可用于获取四种配置好的线程池
二、核心流程
- 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
- 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
- 如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
- 如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。
三、Executor接口方法
- execute() 执行任务无返回结果
- submit() 执行任务有返回结果,返回结果可以通过Future获取
- shutdown() 关闭线程池,但是会执行结束之前获取的任务
- shutdownNow() 立即关闭线程池,结束所有正在执行的任务,之前接受的所有任务被终止
四、Executors四种静态方法获取配置好的线程
Executors.newCachedThreadPool(); //创建一个缓冲池,核心线程数为0,缓冲池容量大小(最大线程数)为Integer.MAX_VALUE,任务队列采用SynchronousQueue,容易发生资源耗尽bug
Executors.newSingleThreadExecutor(); //创建容量为1的缓冲池,任务队列采用LinkedBlockingQueue,无界
Executors.newFixedThreadPool(int); //创建固定容量大小的缓冲池,任务队列采用LinkedBlockingQueue,无界
源码实现
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads