- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java 并发编程:线程池的使用(下)
接上文
二.深入剖析线程池实现原理
在上一节我们从宏观上介绍了 ThreadPoolExecutor ,下面我
们来深入解析一下线程池的具体实现原理,将从下面几个方
们来深入解析一下线程池的具体实现原理,
将从下面几个方
面讲解:
1.线程池状态2.任务的执行3.线程池中的线程初始化 4.任务缓存队列及排队策略
1.线程池状态
2.任务的执行
3.线程池中的线程
初始化 4.任务缓存队列及排队策略
5.任务拒绝策略
6.线程池的关闭
7.线程池容量的动态调整 1. 线程池状
态在 ThreadPoolExecutor
中定义了一个 volatile 变量, 另外
定义了几个 static final 变量表示线程池的各个状态:
volatile int runState;static final int RUNNING = 0;static final int SHUTDOWN = 1;static final int STOP = 2;static final int
TERMINATED = 3;
runState 表示当前线程池的状态,它是一个 volatile 变量用 来保证线程之间的可见性;下面的几个 static final 变量表示
runState 可能的几个取值。
当创建线程池后,初始时,线程池处于 RUNNING 状态; 如果调用了 shutdown() 方法,则线程池处于 SHUTDOWN
状态,此时线程池不能够接受新的任务,它会等待所有任务 执行完毕;
如果调用了 shutdownNow() 方法,则线程池处于 STOP 状态, 此时线程池不能接受新的任务,并且会去尝试终止正在执行 的任务; 当线程池处于 SHUTDOWN 或 STOP 状态,并且所有工作 线程已经销毁,任务缓存队列已经清空或执行结束后,线程 池被设置为 TERMINATED 状态。
任务的执行
在了解将任务提交给线程池到任务执行完毕整个过程之前, 我们先来看一下 ThreadPoolExecutor 类中其他的一些比较 重要成员变量:
private final BlockingQueue workQueue; // 任务缓存队列, 用来存放等待执行的任务 private final ReentrantLock mainLock = new ReentrantLock(); // 线程池的主要状态锁,
对线程池状态(比如线程池大小 //、runState 等)的改变都 要使用这个锁 private final HashSet workers = new
HashSet(); // 用来存放工作集 private volatile long keepAliveTime; // 线程存货时间 private volatile boolean allowCoreThreadTimeOut; // 是否允许为核心线程设置存活 时间 private volatile int corePoolSize; // 核心池的大小 (即线 程池中的线程数目大于这个参数时,提交的任务会被放进任
务缓存队列) private volatile int maximumPoolSize; // 线程池 最大能容忍的线程数 private volatile int poolSize; // 线程池 中当前的线程数 private volatile RejectedExecutionHandler handler; // 任务拒绝策略 private volatile ThreadFactory threadFactory; // 线程工厂,用来创建线程 private int largestPoolSize; // 用来记录线程池中曾经出现过的最大线 程数 private long completedTaskCount; // 用来记录已经执 行完毕的任务个数 每个变量的作用都已经标明出来了,这里要重点解释一下
corePoolSize 、maximumPoolSize 、largestPoolSize 三个变 量。 corePoolSize 在很多地方被翻译成核心池大小,其实我 的理解这个就是线程池的大小。举个简单的例子: 假如有一个工厂,工厂里面有 10 个工人,每个工人同时只 能做一件任务。
因此只要当 10 个工人中有工人是空闲的,来了任务就分配 给空闲的工人做; 当 10 个工人都有任务在做时,如果还来了任务,就把任务 进行排队等待; 如果说新任务数目增长的速度远远大于工人做任务的速度, 那么此时工厂主管可能会想补救措施,比如重新招 4 个临时 工人进来; 然后就将任务也分配给这 4 个临时工人做; 如果说着 14
您可能关注的文档
最近下载
- 【备战25年高考数学】解答题07 6类新定义答题模板(解析版).docx VIP
- (完整)部编版五年级上册语文课堂作业本答案 .pdf VIP
- 化学-辽宁省名校联盟2024年高一10月份联合考试试题和答案.docx VIP
- 2025年国开(中央电大)行管专科《行政组织学》网上形考任务试题及答案_不确定精品.pdf VIP
- 消防救援队伍条令法规授课.pptx
- 2024 IMT-2030(6G)推进组白皮书 -6G分布式自治网络架构和关键技术研究.docx
- 2025年天津市专业技术人员公需考试试题-数字技术领域新职业——大数据应用驱动智能未来.docx VIP
- 广西北海市名校2024-2025学年高一上学期期中检测英语试题(含答案).docx VIP
- 自然地理学(伍光和)课后习题答案.doc VIP
- 食品工程原理试题思考题与习题及答案.doc VIP
文档评论(0)