ThreadPoolExecutor线程池的执行原理

本文中主要对ThreadPoolExecutor讲解

线程池的构造参数

1、corePoolSize:核心线程数
2、maximumPoolSize:最大线程数
3、keepAliveTime:额外的线程的存活时间
4、workQueue:工作队列,阻塞队列
5、threadFactory:线程工厂,可指定线程名字
6、rejectedhandler:拒绝策略

线程池的关键方法

1、public void execute(Runnable command):提交任务到线程池
2、public Future<?> submit(Runnable task):可异步返回的方式提交任务到线程池
3、private boolean addWorker(Runnable firstTask, boolean core) :创建worker,即新建线程工作者,里面包装了Thread
4、final void runWorker(Worker w):worker线程启动时,执行的真正方法,可消费队列中的任务
5、private Runnable getTask():获取队列中的任务,注意poll和take的区别

线程池的执行原理概述

围绕线程池的主要参数和主要方法,总结线程池的执行过程如下:

1、提交任务后,先判断当前池中线程数是否小于corePoolSize,如果小于,则创建新线程执行这个任务。
2、如果大于corePoolSize,则判断等待队列是否已满,如果没有满,则添加到等待队列。
3、如果队列已满,判断当前池中线程数是否大于 maximumPoolSize,如果小于,则可以创建新线程执行任务。如果大于,则不再创建新线程。如果大于则拒绝。
4、否则,创建一个新的线程执行这个任务。
5、getTask方法中,核心线程使用take方式从队列中获取任务,在不设置 allowCoreThreadTimeOut的情况下,将一直
阻塞,不会被回收。
6、非核心线程使用poll的方式从队列中获取任务,经过keepAliveTime后,还没有拿到任务,则非核心线程结束阻塞,
资源将被回收。

线程池的执行原理流程图

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容