最近看了很多长文,有点累了。今天我要做一些简单的事情。今天的文章介绍如何在SpringBoot中开启多线程定时任务?为什么SpringBoot的定时任务是单线程的?要解释为什么,就要从源码入手,直接从@EnableScheduling注解,找到ScheduledTaskRegistrar类,里面有一段代码如下:protectedvoidscheduleTasks(){if(this.taskScheduler==null){this.localExecutor=Executors.newSingleThreadScheduledExecutor();this.taskScheduler=newConcurrentTaskScheduler(this.localExecutor);}}如果taskScheduler为null,则创建单线程线程池:Executors.newSingleThreadScheduledExecutor()。如何配置多线程定时任务?下面介绍三种配置多线程下定时任务的方案。1、重写SchedulingConfigurer#configureTasks()直接实现SchedulingConfigurer这个接口,设置taskScheduler,代码如下:@ConfigurationpublicclassScheduleConfigimplementsSchedulingConfigurer{@OverridepublicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){//设定一个长度10的定时任务线程池taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));}}2.通过配置打开SpringBootquartz已经提供了配置线程池大小的配置,如下;spring.task.scheduling.pool.size=10只要在配置文件中加入上面的配置就可以生效了!3、@Async@Async注解已经被用于启动异步任务。在使用@Async注解之前,必须先配置好线程池。配置如下:@BeanpublicThreadPoolTask??ExecutortaskExecutor(){ThreadPoolTask??ExecutorpoolTask??Executor=newThreadPoolTask??Executor();poolTask??Executor.setCorePoolSize(4);poolTask??Executor.setMaxPoolSize(6);//设置线程活跃时间(秒)poolTask??Executor.setKeepAliveSecond0);/Set(1)队列容量poolTask??Executor.setQueueCapacity(40);poolTask??Executor.setRejectedExecutionHandler(NewThreadPool.CallerRunsPolicy());//等待所有任务结束后再关闭线程池poolTask??Executor.setWaitForTasksToCompleteOnShutdown(true);returnpoolTask??Executor;}然后在@Scheduled方法上打上@Async注解,实现多线程定时任务。代码如下:@Async@Scheduled(cron="0/2****?")publicvoidtest2(){System.out.println("......................executetest2......");}总结本文介绍了Spring实现多线程定时任务的三种方案Boot,你喜欢哪一款呢?
