构造方法
- corePoolSize: 核心线程数
- maximumPoolSize: 池中允许的最大线程数
- keepAliveTime: 当线程数大于核心时,这是多余的空闲线程在终止之前等待新任务的最大时间
- unit: keepAliveTime单位
- workQueue: 任务队列 任务在执行前都会先进入这个队列
- handler: 达到最大线程线程和队列容量时的处理,默认是拒绝(抛出RejectedExecutionException异常)
- AbortPolicy: 默认的拒绝策略 直接抛出异常 不影响线程执行 ; 需要注意如果使用CountDownLatch来做阻塞的话 可能会导致死锁出现
- CallerRunsPolicy: 尝试直接执行被拒绝的任务 直接调用run()方法
- DiscardOldesPolicy: 丢弃队列中最早未被处理的任务,然后再重试执行execute
- DiscardPolicy: 静默拒绝, 与Abort的差异在于不会有异常
execte方法
- workerCountOf方法,活跃线程数 如果小于设置的核心线程数, 这时不会复用线程;直接addWoker -- 这个方法会创建新的工作者
- 当核心线程满了之后,会尝试将任务添加到队列中 offer(command) 如果添加成功会有线程消费 runWork
- 如果添加失败(队列满了) , 会尝试创建非核心线程 addWorker(command,false)
addWorker
- command: 具体的任务
- core : 是否核心线程, 从代码看 这个参数的作用仅仅是在判断容量时 取corePoolSize还是取maximumPoolSize来判断; 从定义来看 非核心线程后面应该要被回收
正常创建woker后添加到wokers内, 并启动worker内的线程 内部调用runWorker
runWoker
大致逻辑为:task为空时,从任务队列中取任务进行处理(这里会判断线程池状态 如果是暂停 则尝试进行中断)
beforeExecute 和 afterExecute 默认无实现 有需要可以重写
processWorkerExit 为线程结束时调用 主要工作是移除worker (这里如果线程池处于暂停状态 会进行中断)
getTask
这里同个wc>corePoolSize及 workQuery.take() 回收非核心线程的工作者; 及当前工作者数量>corePoolSize时; 从任务队列中获取队列超时终止该循环