Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析( 三 )


 
ActiveMQ 中的线程池拒绝策略 1 new RejectedExecutionHandler {2 @Override3 public void rejectedExecution(final Runnable r, final ThreadPoolExecutor executor) {4 try {5 executor.getQueue.offer(r, 60, TimeUnit.SECONDS);6 } catch (InterruptedException e) {7 throw new RejectedExecutionException("Interrupted waiting for BrokerService.worker");8 }910 throw new RejectedExecutionException("Timed Out while attempting to enqueue Task.");11 }12 });activeMq中的策略属于最大努力执行任务型 , 当触发拒绝策略时 , 在尝试一分钟的时间重新将任务塞进任务队列 , 当一分钟超时还没成功时 , 就抛出异常
 
PinPoint 中的线程池拒绝策略 1public class RejectedExecutionHandlerChain implements RejectedExecutionHandler {2 private final RejectedExecutionHandler handlerChain;34 public static RejectedExecutionHandler build(List<RejectedExecutionHandler> chain) {5 Objects.requireNon(chain, "handlerChain must not be ");6 RejectedExecutionHandler handlerChain = chain.toArray(new RejectedExecutionHandler[0]);7 return new RejectedExecutionHandlerChain(handlerChain);8 }910 private RejectedExecutionHandlerChain(RejectedExecutionHandler[] handlerChain) {11 this.handlerChain = Objects.requireNon(handlerChain, "handlerChain must not be ");12 }1314 @Override15 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {16 for (RejectedExecutionHandler rejectedExecutionHandler : handlerChain) {17 rejectedExecutionHandler.rejectedExecution(r, executor);18 }19 }20}pinpoint的拒绝策略实现很有特点 , 和其他的实现都不同 。他定义了一个拒绝策略链 , 包装了一个拒绝策略列表 , 当触发拒绝策略时 , 会将策略链中的rejectedExecution依次执行一遍
 
结语前文从线程池设计思想 , 以及线程池触发拒绝策略的时机引出java线程池拒绝策略接口的定义 。并辅以JDK内置4种以及四个第三方开源软件的拒绝策略定义描述了线程池拒绝策略实现的各种思路和使用场景 。希望阅读此文后能让你对java线程池拒绝策略有更加深刻的认识 , 能够根据不同的使用场景更加灵活的应用 。

作者:KL
链接:http://www.kailing.pub/article/index/arcid/255.html




推荐阅读