[技术总结]ThreadPoolExecutor拒绝策略

可选策略

ThreadPoolExecutor提供了以下拒绝策略(也可以自己实现RejectExecutionHandler接口,进行定制):

  • CallerRunsPolicy: 由调用线程直接进行调用,看上面源码是直接调用了run方法;(相当于没开异步)
  • AbortPolicy:抛出异常;
  • DiscardPolicy:直接丢弃,然后继续执行后面的操作;(如果后面用了CompletableFuture.join还有Future.get等等待操作,有坑)
  • DiscardOldestPolicy:丢弃掉最早的线程,然后执行刚申请的这一个;

执行流程

以下是执行 ThreadExecutor.execute 的流程(执行ExecutorService的submit接口和CompletableFuture.supplyAsync都会执行这个接口)

1、在队列数,线程数都不够之后,就会执行reject;

2、也就是在ExecutorService.submit和调用点CompletableFuture.supplyAsync就会去执行这个操作,然后根据拒绝策略直接忽略或者抛出异常等等;

案例

拒绝策略配置为忽略,仅仅做了上报,导致了申请不到线程的情况下,上游线程将会一直处于阻塞的状态,设置了超时情况,也要等到到超时时间才能抛出异常,无法快速失败,在大流量情况下,会严重降低系统的性能;

行睿的博客 - Private Site Access