Spring @Async 限制线程数量

37

我的问题与这个问题非常相似:@Async prevent a thread to continue until other thread have finished

基本上,我需要在多个线程中运行数百个计算。我希望只运行一些并行线程,例如5个线程,每个线程中有5个计算。

我正在使用Spring框架和@Async选项是自然的选择。我不需要完整功能的JMS队列,那对我来说有点超额。

有什么想法吗? 谢谢

3个回答

46

如果你正在使用Spring的Java配置,则你的配置类需要实现AsyncConfigurer

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

    [...]

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

请参阅@EnableAsync文档以获取更多详细信息:http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html


如果我需要多个异步怎么办? - Dejell
1
您可以使用@Async注释多个方法,它们将共享由@EnableAsync配置定义的线程池/执行器。 - Siggen
1
我的意思是 - 多个执行器,每个执行器具有不同的配置。 - Dejell
13
如果您需要具有不同配置的多个执行器,请查看以下链接:http://www.baeldung.com/spring-async。第4.1节告诉您如何命名执行器并像@Async("<executor name>")一样使用它。 - Anoop Isaac
1
如果我将队列容量设置为50,而该队列已满,假设我的核心池大小线程尚未完成,那么第51个任务会发生什么?它会被拒绝还是异步方法调用者会等待? - KCK
显示剩余2条评论

20

你是否查看了任务执行器?您可以定义线程池,其中包含最大数量的线程来执行您的任务。

如果您想要与@Async一起使用它,请在您的Spring配置中使用此选项:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>

<task:executor id="myExecutor" pool-size="5"/>

<task:scheduler id="myScheduler" pool-size="10"/>

完整的参考资料在此处(25.5.3)。希望这可以帮到您。


17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接