- 在之前的文章中咱们晓得了线程池各个参数的含意,其中有个参数
handler
咱们说了是回绝策略,具体对于线程池的回绝策略咱们这篇文章来剖析
- 首先咱们要了解线程池的回绝策略的作用,它是用来解决当线程池无奈持续解决更多的工作时的解决机制,那么首先咱们要晓得回绝策略的触发机会,我么们来看上面代码:
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(
1,
2,
1,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(),
new ThreadPoolExecutor.DiscardOldestPolicy());
线程池的回绝机会
- 第一种,当咱们失常敞开线程池时也就是应用
shutdown
等办法,这时候即便线程池中还有未实现的工作正在执行,然而因为线程池曾经敞开,所以这时候咱们再持续向线程池提交工作的话就会被回绝
- 第二种,当线程池没有能力再持续解决提交的工作,如队列已满,最大线程数达到,这时候线程池就处于饱和状态
在咱们须要学习和理解的就是第二种,在理论开发中咱们须要解决这种状况,对于线程池运行的流程能够看之前咱们文章,也可关注 i-code.online 博客。
回绝策略
- 首先咱们晓得线程池的回绝策略参数的类型是
RejectedExecutionHandler
类型的,那么咱们能够先来理解一下对于这个接口的关系
- 在上述类图中咱们能够看到
RejectedExecutionHandler
接口有四个实现类,同时都提供了无参构造函数,这四个实现类对应了不同的回绝策略,都有各自的实用场景
AbortPolicy
回绝策略:这种策略在回绝工作时,会间接抛出一个类型为RejectedExecutionException
的RuntimeException
,让你感知到工作被回绝了,于是你便能够依据业务逻辑抉择重试或者放弃提交等策略。
DiscardPolicy
回绝策略:这种策略是当工作提交时间接将刚提交的工作抛弃,而且不会给与任何提醒告诉,所以这种策略应用要谨慎,因为有肯定的危险,对咱们来说基本不晓得提交的工作有没有被抛弃
DiscardOldestPolicy
回绝策略:这种策略和下面类似。不过它抛弃的是队列中的头节点,也就是存活工夫最久的
CallerRunsPolicy
回绝策略:这种策略算是最欠缺的绝对于其余三个,当线程池无能力解决当前任务时,会将这个工作的执行权交予提交工作的线程来执行,也就是谁提交谁负责,这样的话提交的工作就不会被抛弃而造成业务损失,同时这种谁提交谁负责的策略必须让提交线程来负责执行,如果工作比拟耗时,那么这段时间内提交工作的线程也会处于繁忙状态而无奈持续提交工作,这样也就减缓了工作的提交速度,这相当于一个负反馈。也有利于线程池中的线程来消化工作
本文由 AnonyStar 公布, 可转载但需申明原文出处。
欢送关注微信公账号:云栖简码 获取更多优质文章
更多文章关注笔者博客:云栖简码 i-code.online