SpringBoot定时任务实现 以及 多线程执行定时任务

1 定时任务实现

1.1启动类上添加注解 @EnableScheduling

@ComponentScan({"com.xxxx"})
@SpringBootApplication
@EnableSwagger2
@EnableKnife4j
@EnableScheduling   //开启定时任务
public class ServiceCoreApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceCoreApplication.class,args);
    }
}

1.2 定时任务类的创建,添加@Component交给Spring管理
根据cron表达式的不同,定时任务执行的频率也不一样,task2 每5s执行一次,task3每2s执行一次

@Slf4j
@Component
public class ScheduleTask {
//
//    //每填凌晨1点
//    @Scheduled(cron = "0 0 1 * * ? ")
//    public void  task1 () {
//        System.out.println("*****************************task1执行了。。。");
//    }

    @Scheduled(cron = "0/5 * * * * ?  ")
    public void  task2() throws InterruptedException {
        int a = -10 ;

            for (int i = 0; i < 20; i++) {
                Thread.sleep(2000);
                    a++;


           log.info(Thread.currentThread().getName()+"当前执行定时任务1"+a);

        } }

    @Scheduled(cron = "0/2 * * * * ?  ")
    public void  task3() {
        //方法的主体里面写你要执行的业务逻辑,比如定时发邮件啊,定时刷新数据之类的
        log.info(Thread.currentThread().getName()+"当前执行定时任务2");
    }

}

1.3 执行效果
SpringBoot定时任务实现 以及 多线程执行定时任务_第1张图片
可以看出是单线程的,虽然设置了任务3 2s执行一次,任务2 没有跑完,任务3不会执行。在实际工作中。

实际上这种方式执行定时任务和

示例1

Runnable runnable = new Runnable() {
             
    @Override
    public void run() {
    System.out.println("定时任务线程执行中......");
    }
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleWithFixedDelay(runnable, 5000, 500, TimeUnit.MILLISECONDS);

示例代码的方法本质上是差不多的,,,springBoot初始化时,会创建一个线程数为1的线程池,,,,
具体详见https://blog.csdn.net/javageektech/article/details/104111942

2 实现多线程执行定时任务

2.1 方法1如示例1,手动新建线程
2.2 方法2 配置文件配置

spring:
  profiles:
    active: dev
  application:
    name: service-core
#  task:
#    scheduling:
#      pool:
#        size: 2  //指定线程池大小

SpringBoot定时任务实现 以及 多线程执行定时任务_第2张图片
2.3 方法3 新建配置类,先将配置文件的多线程注释掉

@Configuration
public class ScheduConfig  implements SchedulingConfigurer{


    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

        scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(2)); //指定线程池大小
    }
}

SpringBoot定时任务实现 以及 多线程执行定时任务_第3张图片
问题来了,当配置文件和配置类同时存在会怎么样呢?
我猜 配置类的优先级高于配置文件的设置。仅仅是个人无端猜测。

你可能感兴趣的:(springboot,spring,java,定时任务,多线程)