Spring@Async失败,出现rejectedExecutionexception



我们需要并行运行任务,所以我们使用spring@Async功能。为了提供executor配置,我们正在创建一个executor 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+队列大小,则下一个任务提交将失败,并出现rejectedExecutionexception。

为了克服这一问题,我们从以下来源研究了调用者中止策略:https://www.baeldung.com/java-rejectedexecutionhandler它提供了在队列和线程已经满的情况下主线程本身运行任务的便利。

它的设置需要:executor.setRejectedExecutionHandler(new ThreadPoolExecutior.CallerRunsPolicy(((;

Q1.我需要了解ThreadPoolTaskExecutor使用LinkedBlocking队列,我的预期是,一旦最大池线程和队列大小已满并被占用,主线程将在提交新任务时被阻塞,但它却以RejectedException失败,即使ThreadPoolTaskExecutor中存在阻塞队列?

Q2.为了克服这个问题,我们如何实现一种阻塞机制,在这种机制中,main在提交新任务时不会失败,也不会自己运行(如executor.setRejectedExecutionHandler(new ThreadPoolExecutior.CallerRunsPolicy((((,但会因队列中的可用空间而被阻塞,从而将任务放入队列?

无限期地阻塞主线程可能导致死锁场景。这就是为应用程序用户提供一个处理程序的原因,以便在线程池队列容量超过时决定应该采取什么行为。

如下面线程中所讨论的,可以实现所需阻塞行为的各种实现,但应该注意阻塞的时间和其他死锁场景。

队列已满时线程池执行程序块?

相关内容

  • 没有找到相关文章

最新更新