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

标签 java multithreading spring-boot threadpoolexecutor

我正在使用 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/

相关文章:

java - 如何允许 Sprite 只从一侧移动到另一侧?

枚举值 : passing the annotation instance on to user code 上的 Java 注释

c++ - 实例化线程而不运行它们?

java - JPA存储库读取、删除和保存具有旧ID的对象

java - 从 @EmbeddedId 类中提取父类(super class)时,实体没有持久性 id 属性

java - 初始化对象变量错误

c++ - 0 作为 std::condition_variable::wait_for 中的超时

c++ - 向进程边界发出线程信号

java - 如何自定义Spring Boot标语?

java - 部署spring boot应用需要web.xml吗