我的问题与此问题非常相似:@Async prevent a thread to continue until other thread have finished
基本上我需要在更多线程中运行〜数百次计算。我想只运行一些并行线程,例如5个计算的5个线程在并列中。
我使用spring框架和@Async选项是很自然的选择。我不需要全功能的JMS队列,这对我来说有点开销。
有什么想法吗? 谢谢
答案 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