Spring @Async限制线程数

问题描述 投票:20回答:3

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

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

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

任何想法?谢谢

multithreading spring asynchronous thread-synchronization
3个回答
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)。希望这会有所帮助。


30
投票

如果您使用的是Spring的Java配置,则您的config类需要实现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


0
投票

自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

© www.soinside.com 2019 - 2024. All rights reserved.