在spring-boot中,默认的调度程序池大小是多少?
在spring-boot中,默认的调度程序池大小是多少?
我正在使用spring-boot
和@Scheduled
注解来执行一些任务。\n如何在spring-boot中找到默认的计划任务池大小是多少?\n原因:下面的类不会并行执行任务,而是一个接着一个执行。也许默认只配置了一个单线程执行器?\n
@Service public class ZipFileTesterAsync { @Scheduled(fixedDelay = 60000, initialDelay = 500) public void run() throws Exception { System.out.println("导入1"); TimeUnit.MINUTES.sleep(1); System.out.println("导入1完成"); } @Scheduled(fixedDelay = 60000, initialDelay = 1000) public void run2() throws Exception { System.out.println("导入2"); TimeUnit.MINUTES.sleep(1); } }
\n结果:第二个任务在第一个任务完成后执行。
默认的调度器池大小为1,但是在springboot2.1.0及以后的版本中,可以通过更改application.properties
中的spring.task.scheduling.pool.size
的值来设置池大小。
当触发周期短于执行持续时间时,相同的任务将按序执行。Spring Boot将使用最多20个线程并行执行不同的任务。
一开始我在查找有关这个属性的文档时遇到了困难,所以这里提供一个链接给其他想要确认这一点的人:[docs4dev.com/docs/en/spring-boot/2.1.1.RELEASE/reference/boot-features-task-execution-scheduling.html](https://www.docs4dev.com/docs/en/spring-boot/2.1.1.RELEASE/reference/boot-features-task-execution-scheduling.html)
官方文档:[docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling)
这个解决方法更加优雅,因为我们可以在不重新部署应用程序的情况下更改配置。
请注意,如果您或您的任何依赖定义了一个SchedulingConfigurer
bean,spring.task.scheduling.pool.size
将不再被使用,因为TaskSchedulingAutoConfiguration
有一个({ SchedulingConfigurer.class, ...
。
是的,默认情况下,所有的`@Scheduled`方法共享一个线程。
可以通过定义一个`SchedulingConfigurer`来覆盖这个行为,如下所示:
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer { public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(100); taskScheduler.initialize(); taskRegistrar.setTaskScheduler(taskScheduler); } }
这个例子确保所有的`@Scheduled`方法共享一个大小为100的线程池。
是否可以为不同的注解设置不同的线程池?
可以创建不同的`ThreadPoolTaskScheduler`并使用`threadPoolTaskScheduler.schedule`方法。
不行,据我所知不可以。`ScheduledAnnotationBeanPostProcessor`始终使用默认的任务调度器(可以查看代码)。要能够将任务调度到不同的线程池,只需使用内置的Java`java.util.concurrent.Executors`创建另一个线程池。
这种方法会创建100个线程,即使前面的线程已经停止了,有没有办法设置一个更高的最大线程数,但保持较低的运行线程数?