ThreadPoolExecutor源码解析

本文详细解析了Java线程池的构造方法、核心参数如核心线程数、最大线程数、任务队列等,以及各种拒绝策略,如AbortPolicy、CallerRunsPolicy等,并介绍了线程池的工作流程和关键函数如execute、runWorker等。
摘要由CSDN通过智能技术生成
构造方法
  • corePoolSize:  核心线程数
  • maximumPoolSize: 池中允许的最大线程数
  • keepAliveTime: 当线程数大于核心时,这是多余的空闲线程在终止之前等待新任务的最大时间
  • unit: keepAliveTime单位
  • workQueue: 任务队列  任务在执行前都会先进入这个队列
  • handler:   达到最大线程线程和队列容量时的处理,默认是拒绝(抛出RejectedExecutionException异常)
    • AbortPolicy: 默认的拒绝策略 直接抛出异常 不影响线程执行 ; 需要注意如果使用CountDownLatch来做阻塞的话 可能会导致死锁出现
    • CallerRunsPolicy:   尝试直接执行被拒绝的任务 直接调用run()方法
    • DiscardOldesPolicy:  丢弃队列中最早未被处理的任务,然后再重试执行execute
    • DiscardPolicy: 静默拒绝, 与Abort的差异在于不会有异常
 execte方法

  1.  workerCountOf方法,活跃线程数  如果小于设置的核心线程数, 这时不会复用线程;直接addWoker --   这个方法会创建新的工作者
  2. 当核心线程满了之后,会尝试将任务添加到队列中 offer(command)  如果添加成功会有线程消费  runWork
  3. 如果添加失败(队列满了) , 会尝试创建非核心线程 addWorker(command,false)
addWorker
  • command: 具体的任务
  • core : 是否核心线程,  从代码看 这个参数的作用仅仅是在判断容量时 取corePoolSize还是取maximumPoolSize来判断;   从定义来看   非核心线程后面应该要被回收

正常创建woker后添加到wokers内,  并启动worker内的线程   内部调用runWorker

runWoker

大致逻辑为:task为空时,从任务队列中取任务进行处理(这里会判断线程池状态 如果是暂停 则尝试进行中断)

beforeExecute 和 afterExecute 默认无实现  有需要可以重写

processWorkerExit 为线程结束时调用  主要工作是移除worker (这里如果线程池处于暂停状态 会进行中断)

getTask

这里同个wc>corePoolSize及 workQuery.take() 回收非核心线程的工作者; 及当前工作者数量>corePoolSize时; 从任务队列中获取队列超时终止该循环

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值