> 文章列表 > 线程池中的拒绝策略

线程池中的拒绝策略

线程池中的拒绝策略

线程池中的拒绝策略

什么情况下出发拒绝策略?

  • 当提交任务数大于corePoolSize的时候,会将多余任务缓存在workQueue阻塞队列中
  • 当阻塞队列满了,会扩充线程数
  • 当扩充线程数大于maximumPoolSize的时候,就会触发拒绝策略

也就是说,当任务数大于workQueue.size() 和maximumPoolSize时,会触发拒绝策略

线程池的四种拒绝策略

线程池中的拒绝策略

第一种,AbortPolicy(中止策略)

很简单,当触发拒绝策略时,抛出一个RejectedExecutionException异常

这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现。

第二种,DiscardPolicy(丢弃策略)

也很简单,当触发拒绝策略时,静默地丢弃被拒绝的任务,仅此而已

使用此策略,可能会使我们无法发现系统的异常状态。建议是一些无关紧要的业务采用此策略。例如,某些视频网站统计视频的播放量就是采用的这种拒绝策略。

第三种,DiscardOldestPolicy(丢弃最早的策略)

当触发拒绝策略时,会丢弃掉最早的未被处理的任务,然后重新尝试提交被拒绝的任务(被拒绝的任务,就是触发拒绝策略的任务),但是当执行器挂掉的时候,会丢掉被拒绝的任务

第四种CallerRunsPolicy(找帮手策略)

第四种CallerRunsPolicy(找帮手策略)

触发拒绝策略时,会在执行方法的调用者线程中执行任务,除非调用者线程挂掉,则会直接丢弃任务