线程池自定义拒绝策略

通过实现RejectedExecutionHandler接口,自定义一个拒绝策略类,重写它的rejectedExecution()方法:

public class CustomRejectionHandler implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        System.out.println(r.toString() + "被拒绝了,执行入库操作,之后手动补偿");
    }
}

测试下:

public class SpringbootApplication {
    
    private static AtomicInteger atomicInteger = new AtomicInteger(1);

    public static void main(String[] args) throws Exception {
        CustomRejectionHandler customRejectionHandler = new CustomRejectionHandler();
        ExecutorService executorService = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10), customRejectionHandler);
        for (int i = 0; i < 20; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("第" + atomicInteger.getAndIncrement() + "个任务被执行");
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

运行结果:
在这里插入图片描述

因为核心线程数和最大线程数都是5,而队列容量是10,所以同一时间最多可接受15个任务,加了个睡眠时间1s,然后可以发现20个任务中只有15个任务被执行,剩下的5个任务都执行了自定义的拒绝策略。

总结

有时候默认提供的拒绝策略无法满足业务需要,那么就需要开发自己定义符合要求的拒绝策略了。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105675118