Java并发编程:线程池的使用(下).docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

wangyueyue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档