threadpoolexecutor 调度策略解析.docxVIP

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

6-

ThreadPoolExecutor调度策略解析

一、概述

ThreadPoolExecutor是Java并发编程中非常重要的一个类,它属于java.util.concurrent包,允许我们创建一个可以在给定数量的线程中执行任务的线程池。ThreadPoolExecutor不仅提供了强大的线程管理能力,还提供了灵活的调度策略,以满足不同类型的任务需求。理解ThreadPoolExecutor的调度策略对于高效地使用线程池至关重要。

二、ThreadPoolExecutor的核心组件

在深入讨论ThreadPoolExecutor的调度策略之前,我们首先需要了解其内部的一些核心组件:

核心线程数(CorePoolSize):线程池的基本大小,即即使线程是空闲的,也保留在池中的线程数。

最大线程数(MaximumPoolSize):线程池中允许的最大线程数。当工作队列满了,并且当前线程数小于最大线程数时,线程池会创建新的线程来执行任务。

工作队列(WorkQueue):用于存放待执行任务的队列。ThreadPoolExecutor支持多种类型的队列,如ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等。

线程存活时间(Keep-AliveTime):当线程数大于核心线程数时,这是多余空闲线程在终止前等待新任务的最长时间。

时间单位(TimeUnit):与线程存活时间一起使用,定义时间单位,如TimeUnit.SECONDS表示秒。

拒绝策略(RejectedExecutionHandler):当工作队列满了,并且线程池中的线程数达到最大线程数时,新提交的任务将被拒绝。ThreadPoolExecutor提供了几种默认的拒绝策略,也可以自定义拒绝策略。

三、ThreadPoolExecutor的调度策略

ThreadPoolExecutor的调度策略主要体现在如何处理新提交的任务和如何管理线程池中的线程。以下是一些关键点的详细解析:

1新任务的提交

当一个新任务提交给ThreadPoolExecutor时,它首先会检查当前线程池中的线程数是否小于核心线程数。如果是,它会尝试创建一个新线程来执行任务。

如果当前线程数等于核心线程数,但工作队列未满,那么新任务会被添加到工作队列中等待执行。

如果工作队列已满,但线程数还未达到最大线程数,那么线程池会创建一个新的线程来执行任务。

如果线程数已经达到最大线程数,且工作队列也满了,那么ThreadPoolExecutor会触发拒绝策略来处理这个新任务。

2线程的管理

当线程池中的线程完成一个任务后,它并不会立即销毁。如果线程数大于核心线程数,空闲线程会在线程存活时间内等待新任务。如果在这段时间内没有新任务到来,那么多余的线程会被销毁。

如果线程池中的线程因为异常而终止,那么ThreadPoolExecutor会尝试创建一个新的线程来替代它。

线程池中的线程可以被外部线程中断,但ThreadPoolExecutor不会因此而停止执行已经提交的任务。

3队列的选择

ThreadPoolExecutor的调度策略还体现在对工作队列的选择上。不同的工作队列类型会影响任务的调度方式。例如:

ArrayBlockingQueue是一个有界队列,它按照FIFO(先进先出)原则对任务进行排序。当队列满时,新任务会根据上述的调度策略进行处理。

LinkedBlockingQueue是一个无界队列,如果不设置最大线程数,它可以容纳任意数量的任务。这可能会导致内存耗尽。

SynchronousQueue不存储任务,每个插入操作必须等待一个相应的删除操作。这通常与newThreadPerTask策略一起使用,即为每个任务创建一个新线程。

4拒绝策略的选择

当ThreadPoolExecutor无法处理新任务时,它会触发拒绝策略。ThreadPoolExecutor提供了以下几种默认的拒绝策略:

AbortPolicy:直接抛出RejectedExecutionException。

CallerRunsPolicy:调用执行自己的线程运行任务。

DiscardOldestPolicy:丢弃队列中最老的任务,然后重新尝试执行任务(如果仍然失败,则重复此过程)。

DiscardPolicy:不处理,直接丢弃任务。

此外,还可以实现RejectedExecutionHandler接口来定义自己的拒绝策略。

四、深入解析调度策略

1核心线程与最大线程

核心线程数是线程池启动时立即创建的线程数量。这些线程始终存在于线程池中,即使它们处于空闲状态。当任务队列满且当前线程数小于最大线程数时,线程池会创建新的线程来处理任务,直到线程数达到最大

文档评论(0)

文章交流借鉴 + 关注
实名认证
文档贡献者

妙笔如花

1亿VIP精品文档

相关文档