可选策略
ThreadPoolExecutor提供了以下拒绝策略(也可以自己实现RejectExecutionHandler接口,进行定制):
- CallerRunsPolicy: 由调用线程直接进行调用,看上面源码是直接调用了run方法;(相当于没开异步)
- AbortPolicy:抛出异常;
- DiscardPolicy:直接丢弃,然后继续执行后面的操作;(如果后面用了CompletableFuture.join还有Future.get等等待操作,有坑)
- DiscardOldestPolicy:丢弃掉最早的线程,然后执行刚申请的这一个;
执行流程
以下是执行 ThreadExecutor.execute 的流程(执行ExecutorService的submit接口和CompletableFuture.supplyAsync都会执行这个接口)
1、在队列数,线程数都不够之后,就会执行reject;
2、也就是在ExecutorService.submit和调用点CompletableFuture.supplyAsync就会去执行这个操作,然后根据拒绝策略直接忽略或者抛出异常等等;
案例
拒绝策略配置为忽略,仅仅做了上报,导致了申请不到线程的情况下,上游线程将会一直处于阻塞的状态,设置了超时情况,也要等到到超时时间才能抛出异常,无法快速失败,在大流量情况下,会严重降低系统的性能;