春季@Async失败,出现被拒绝的例外

时间:2020-09-20 20:56:10

标签: multithreading threadpoolexecutor spring-async

我们需要并行运行任务,因此我们正在使用spring @Async功能。为了提供执行程序配置,我们正在创建一个执行程序bean。

@Bean(name = "async")
    public Executor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(5);
        executor.setThreadNamePrefix("MyExecutor-");
        executor.initialize();
        return executor;
    } 

一旦达到并行任务的数量超过maxpoolSize +队列大小,下一个任务提交就会失败,并带有被拒绝的ExecutionException。

为解决此问题,我们从以下来源调查了调用方中止策略:https://www.baeldung.com/java-rejectedexecutionhandler,该方法提供了在队列和线程已满的情况下主线程本身运行任务的功能。

设置它的需要是:executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

Q1。我需要了解ThreadPoolTask​​Executor使用LinkedBlocking队列,我的期望是,一旦最大池线程和队列大小已满并被占用,主线程将在提交新任务时被阻塞,但是即使阻塞,它也会因RejectedException失败。 ThreadPoolTask​​Executor中是否存在队列?

第二季度。为了克服这个问题,我们如何实现一种阻塞机制,使主体在提交新任务时不会失败,也不会自行运行(例如在executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy())中),但是会为可用空间阻塞在队列中将任务放入队列中?

1 个答案:

答案 0 :(得分:0)

无限期地阻塞主线程会导致死锁情况。这就是为应用程序用户提供处理程序来决定线程池队列容量超出时应采取的行为的原因。

所需的阻止行为的各种实现都可以通过以下线程中的讨论来实现,但应注意阻止多长时间以及其他死锁情况。

ThreadPoolExecutor Block When Queue Is Full?

相关问题