任务拒绝策略.PDFVIP

  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 Concurrency (31): 线程池 part 4 Executor 任务拒绝策略 上一节中提到关闭线程池过程中需要对新提交的任务进行处理。这个是 java.util.concurrent.RejectedExecutionHandler 处理的逻辑。 在没有分析线程池原理之前先来分析下为什么有任务拒绝的情况发生。 这里先假设一个前提:线程池有一个任务队列,用于缓存所有待处理的任务,正在处理的任 务将从任务队列中移除。因此在任务队列长度有限的情况下就会出现新任务的拒绝处理问题, 需要有一种策略来处理应该加入任务队列却因为队列已满无法加入的情况。另外在线程池关 闭的时候也需要对任务加入队列操作进行额外的协调处理。 RejectedExecutionHandler 提供了四种方式来处理任务拒绝策略。 这四种策略是独立无关的,是对任务拒绝处理的四中表现形式。最简单的方式就是直接丢弃 任务。但是却有两种方式,到底是该丢弃哪一个任务,比如可以丢弃当前将要加入队列的任 务本身(DiscardPolicy)或者丢弃任务队列中最旧任务(DiscardOldestPolicy)。丢弃最旧 任务也不是简单的丢弃最旧的任务,而是有一些额外的处理。除了丢弃任务还可以直接抛出 一个异常(RejectedExecutionException),这是比较简单的方式。抛出异常的方式 (AbortPolicy )尽管实现方式比较简单,但是由于抛出一个RuntimeException,因此会中 断调用者的处理过程。除了抛出异常以外还可以不进入线程池执行,在这种方式 (CallerRunsPolicy)中任务将有调用者线程去执行。 上面是一些理论知识,下面结合一些例子进行分析讨论。 package xylz.study.concurrency; import java.lang.reflect.Field; import java.util.concurrent.ArrayBlockingQueue; import java.util.concur rent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy; public class ExecutorServiceDemo { static void log(String msg) { System.out.println(System.currentTimeMillis() + - + msg); } static int getThreadPoolRunState(ThreadPoolExecutor pool) throws Exception { Field f = ThreadPoolExecutor.class.getDeclaredField(runState); f.setAccessible(true); int v = f.getInt(pool); return v; } public static void main(String[] args) throws Exception { ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new ArrayBlockingQueueRunnable(1)); pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); for (int i = 0; i 10; i++) { final int index = i; pool.submit(new Runnable() { public void run() { log(run task: + index + - + Thread.currentThread().getName());

文档评论(0)

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

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

版权声明书
用户编号:6153235235000003

1亿VIP精品文档

相关文档