Spring @Async限制线程数

时间:2012-11-03 06:50:14

标签: multithreading spring asynchronous thread-synchronization

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

基本上我需要在更多线程中运行〜数百次计算。我想只运行一些并行线程,例如5个计算的5个线程在并列中。

我使用spring框架和@Async选项是很自然的选择。我不需要全功能的JMS队列,这对我来说有点开销。

有什么想法吗? 谢谢

3 个答案:

答案 0 :(得分:27)

如果您使用的是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

答案 1 :(得分:17)

你签出了Task Executor吗?您可以定义一个线程池,其中包含执行任务的最大线程数。

如果要将其与@Async一起使用,请在spring-config中使用:

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

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

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

完整参考here(25.5.3)。希望这会有所帮助。

答案 2 :(得分:2)

自Spring Boot 2.1起,您可以使用自动配置并更改应用程序属性文件中的最大线程数

spring.task.execution.pool.max-size=4

请参阅完整文档:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-task-execution-scheduling