admin管理员组

文章数量:1794759

SpringBoot @Schedule多线程

SpringBoot @Schedule多线程

        @Schedule创建的定时任务默认单线程的同步执行,虽然可以通过SchedulingConfigurer指定线程的个数,但是当代码运行起来时还是同步执行,同一个调度任务还需要阻塞等待上一次任务执行完成之后才能继续执行下一次任务。不同调度任务也是同一样的,需要阻塞等待上一个调度任务完成之后,才可以继续执行下一个调度任务。所以我们需要开始定时器的多线程异步执行。

1.@Scheduled方法改成异步执行

通过在@Schedule注解方法,修改成异步执行,可以使用Java多线程。

@SpringBootApplication @EnableScheduling public class StartWebfluxProgram { public static void main(String[] args) { SpringApplication.run(StartWebfluxProgram.class, args); } @Scheduled(fixedRate = 2000) public void simpleSchedule() { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(() -> { System.out.println(new Date() + ";定时器执行id=" + Thread.currentThread().getId()); sleep(4); System.out.println(new Date() + ";定时器执行id=" + Thread.currentThread().getId() + ";线程完成"); }); } private void sleep(int seconds) { try { Thread.sleep(seconds * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

 2.@EnableAsync和@Async

        对于同一个调度任务的执行,如果任务的执行时间超过该任务的下一次执行时间,会启动另外一个线程去执行,不会跳造成任务丢失(前提:有空闲线程去执行)         对于多个不同的调度任务在执行时间上有交集,在执行任务A的过程中,到了任务B的执行时间,任务B不会阻塞,不需要等待任务A完成,会启动另外一个线程去执行任务B(前提:有空闲线程去执行)

@SpringBootApplication @EnableScheduling @EnableAsync public class StartWebfluxProgram { public static void main(String[] args) { SpringApplication.run(StartWebfluxProgram.class, args); } @Scheduled(fixedRate = 2000) @Async public void simpleSchedule() { System.out.println(new Date() + ";定时器执行id=" + Thread.currentThread().getId()); sleep(4); System.out.println(new Date() + ";定时器执行id=" + Thread.currentThread().getId() + ";线程完成"); } @Bean("taskScheduler") public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(3); return taskScheduler; } private void sleep(int seconds) { try { Thread.sleep(seconds * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

@Async注解并不能控制线程池的大小,而是使用默认的线程池,所以我们要通过@Async("taskScheduler")控制线程池的大小

通过实现SchedulingConfigurer接口,我发现只能实现多线程,并不能开始定时任务的异步执行。

 

 

本文标签: 多线程SpringBootschedule