线程池中的拒绝策略
什么情况下出发拒绝策略?
- 当提交任务数大于corePoolSize的时候,会将多余任务缓存在workQueue阻塞队列中
- 当阻塞队列满了,会扩充线程数
- 当扩充线程数大于maximumPoolSize的时候,就会触发拒绝策略
也就是说,当任务数大于workQueue.size() 和maximumPoolSize时,会触发拒绝策略
线程池的四种拒绝策略
第一种,AbortPolicy(中止策略)
很简单,当触发拒绝策略时,抛出一个RejectedExecutionException异常
这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现。
第二种,DiscardPolicy(丢弃策略)
也很简单,当触发拒绝策略时,静默地丢弃被拒绝的任务,仅此而已
使用此策略,可能会使我们无法发现系统的异常状态。建议是一些无关紧要的业务采用此策略。例如,某些视频网站统计视频的播放量就是采用的这种拒绝策略。
第三种,DiscardOldestPolicy(丢弃最早的策略)
当触发拒绝策略时,会丢弃掉最早的未被处理的任务,然后重新尝试提交被拒绝的任务(被拒绝的任务,就是触发拒绝策略的任务),但是当执行器挂掉的时候,会丢掉被拒绝的任务
第四种CallerRunsPolicy(找帮手策略)
第四种CallerRunsPolicy(找帮手策略)
触发拒绝策略时,会在执行方法的调用者线程中执行任务,除非调用者线程挂掉,则会直接丢弃任务