联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:18888888888 QQ:88888

jdk原生Timer和spring提供的SpringTask的用法

单体的定时任务

1.定时任务

1.1.Timer的使用

说明:Timerjdk1.3引入的工具类java.util.Timer
使用步骤:

  1. 创建一个定时器: Timer timer = new Timer();

  2. 设置一个定时任务: timer.schedule(TimerTask定时任务抽象类的实现,其他参数);

  3. api:

    3.1. timer.schedule(TimerTask,延时的毫秒数) 执行一次
    Timer timer = new Timer();
    System.out.println("当前时间start:"+new Date());
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("当前时间run1:"+new Date());
            //运行完后,停止定时任务,否则程序不退出
            timer.cancel();
        }
    },2000);

    3.2. timer.schedule(TimerTask,Date) Date代表绝对时间,定时任务在指定时间执行一次
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("当前时间run2:"+new Date());
            timer.cancel();
        }
    },new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2025-7-27 00:59:00"));

    3.3. timer.schedule(TimerTask,延时的毫秒数或者Date,每次重复的毫秒数);
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("当前时间run3:"+new Date());
        }
    },new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2025-7-27 00:59:00"),1000);

 

1.2.SpringTask的使用

说明:SpringTaskSpring框架提供的轻量级定时任务调度工具,他集成在Spring-Context依赖中!!!,因此我们只需要引入spring-boot-starter-web依赖即可
缺点: 默认实现单线程任务(多个定时任务Task1和Task2只能串行(同一个线程)执行,不能并发执行)
使用步骤:

  1. 引入依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.5.6</version>
    </dependency>

  2. 开启定时任务功能:

    @EnableScheduling   //加载springboot启动类上

  3. 定义定时任务:

    @Component
    public class SpringTaskTest {
        @Scheduled(cron = "0/5 * * * * ?")   //使用cron表达式
        public void Task1(){
            System.out.println("当前的时间:"+new Date());
            System.out.println("当前的线程:"+Thread.currentThread().getName());
        }
        @Scheduled(cron = "0/5 * * * * ?")   //运行结果,这两个均由同一个线程执行
        public void Task2(){
            System.out.println("当前的时间:"+new Date());
            System.out.println("当前的线程:"+Thread.currentThread().getName());
        }
    }

  4. 解决默认单线程执行的配置和一些关闭时配置

    spring:
      task:
        scheduling:
          pool:
            size:10  #默认为1(单线程),指定定时任务线程池的线程大小
          thread-name-prefix: task-scheduler-  #指定执行该定时任务的线程名称的前缀
          shutdown:
            await-termination: false  #默认false,应用关闭是否等待当前正在执行的定时任务完成
            await-termination-period: 10s  #用用关闭,等待任务完成的最大时间

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册