gpt4 book ai didi

java - 使用 @Async 注释限制线程数并在达到最大线程数时等待

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:26 26 4
gpt4 key购买 nike

我正在使用 Spring 的 Java 配置和 AsyncConfigurer:

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(10);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
}

现在假设我有一个带有@Async 注释的方法,并且假设它已经被调用了 2 次并且有 2 个线程仍在运行。据我了解,对它的任何新调用都将添加到容量为 10 的队列中。现在如果我收到第 11 个任务,它的行为会是什么?它会拒绝此处所述的任务吗:https://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html ?还是调用者会等待队列槽变空?

我的要求是不执行使用@Async 方法生成的固定数量的线程,并在达到最大线程数时让调用者等待。如果我将 ConcurrentTaskExecutor 与特定大小的固定线程池一起使用,是否可以实现这一点?

最佳答案

我想在不丢失任何消息的情况下限制可能的线程数。现有的答案没有满足我的这个要求,我找到了另一种方法来做到这一点。因此,将其发布为答案:


我做了一个Executor Bean,如下:

@Bean(name = "CustomAsyncExecutor")
public Executor customThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(0);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("Async_Thread_");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}

然后使用

@Async("CustomAsyncExecutor")
public void methodName(){
....
}

鉴于当线程繁忙和队列已满时,新任务会被拒绝,

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy())

帮助我,当我的 5 个线程忙碌时,我的调用线程将执行任务,因为我的调用线程在异步函数中,它不会接受任何新任务。因此,我不会在不增加队列大小的情况下丢失我的任务。

关于java - 使用 @Async 注释限制线程数并在达到最大线程数时等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56018209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com