java中实现一个定时任务的方式

 更新时间:2025年03月08日 11:53:05   作者:北极的企鹅88  
本文介绍了三种在Java中实现定时任务的方法,并推荐使用Spring Boot注解方式,介绍了如何使用`@Scheduled`注解结合Cron表达式来设置定时任务,并提供了一个示例配置文件

java实现一个定时任务

需求说明

项目中需要每天定时更新mysql数据到另一个数据库中,暂定每天中午12:00定时启动更新任务。

实现方式有三种

第一种

使用javaJDK自带的timeTask和Calendar实现定时任务,这种方式可以设置延时,执行间隔,也能设置执行时间点,我用的就是这种。

//第一种:每天中午12点定时开启任务
public static void main(String[] args) {
        //Calendar这个技术也是基于java的线程去做的
        //设置第一次更新的时间点
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小时
        calendar.set(Calendar.MINUTE, 0);//控制分钟,
        calendar.set(Calendar.SECOND, 0);//控制秒,
         //利用java的api Timer来完成一个定时任务
        Timer timer = new Timer();
        TimerTask task=new TimerTask() {
            @Override
            public void run() {
            // 实现自己的定时任务操作
                System.out.println("这是一个定时任务!去更新数据库数据!");

            }
        };
        /*
        * 从第一次发布任务的12:00开始执行任务,每隔(1000 * 60 * 60 * 24)天,定时执行
        * */
        timer.schedule(task, calendar.getTime() , 1000 * 60 * 60 * 24);
    }
    
//第二种:定时更新,启动就开始开启定时任务,每隔2秒钟开启一次任务
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时任务启动" + new Date());
            }
        };
        Timer timer = new Timer();
//方法参数,定时执行内容,延时(单位毫秒),执行间隔(单位毫秒)
        timer.schedule(timerTask,100,2000);
    }

第二种

使用ScheduledExecutorService执行定时任务,这个也是JDK自带的,它执行的定时任务的线程是从线程池中取,任务是并行进行的,互不影响。

/**
 * 使用ScheduledExecutorService执行定时任务
 */
public class get003 {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        //参数;任务体,首次执行的延时时间,任务执行的间隔,间隔时间单位
        service.scheduleAtFixedRate(()-> System.out.println("任务启动"+new Date()),0,3, TimeUnit.SECONDS);
    }
}

第三种

(推荐)结合springboot注解实现定时任务,新建一个任务类,在该类上加上@Component和@EnableScheduling注解,在方法上加上@Scheduled注解,在@Scheduled注解的属性cron上加上启动时间,然后启动项目,到了任务启动时间就会去执行任务方法。

可以在该类中定义多个定时任务,只需要在每个任务方法上加上@Scheduled注解即可。

/**
 * 定时任务,主类加上@Component和@EnableScheduling注解,在方法上加上@Scheduled注解
 * 注意的是,可以加个开关来决定任务是否执行
 */
@Slf4j
@Component
@EnableScheduling
public class TaskInfo {
//从配置文件中读取开关的值
    @Value("${task.switch.is-open}")
    private boolean flag;
    @Scheduled(cron = "${task.corn.task-corn}")
    public void m1() {
//判断开关状态
        if (flag){
            SimpleDateFormat stf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = stf.format(new Date());
            System.out.println("定时任务启动->>" + format);
        }else {
            System.out.println("未开启定时任务开关,请重试!");
        }
    }
}
  • @Value:从配置文件中读取属性值
  • cron:特殊的时间格式,时分秒 年月日都是有不同的表达形式。

这里我设置了一个任务开关,当工程部署在多个服务器时,如何我想让某个时间点只有一台机器在跑定时任务,我就可以将其他的开关设置为false,需要启动的那台开关设置为true,可以灵活的控制定时任务的启动,配置文件定时任务配置如下:

  #定时任务
task:
    switch:
      is-open: false #开关
    corn:
      task-corn: 0 48 21 * * ? #定时任务时间格式

2021-08-16 21:47:31.255  INFO 8888 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-08-16 21:47:31.255  INFO 8888 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.38]
2021-08-16 21:47:31.555  INFO 8888 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-08-16 21:47:31.555  INFO 8888 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1174 ms
2021-08-16 21:47:31.956  INFO 8888 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-08-16 21:47:32.104  INFO 8888 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService 'taskScheduler'
2021-08-16 21:47:32.151  INFO 8888 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-08-16 21:47:32.165  INFO 8888 --- [           main] com.cry.PdosWebApplication               : Started PdosWebApplication in 2.181 seconds (JVM running for 3.035)
进销存web启动成功!
未开启定时任务开关,请重试!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java Thumbnails 图片处理的使用

    java Thumbnails 图片处理的使用

    这篇文章主要介绍了java Thumbnails 图片处理的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • mybatis使用pagehelper插件过程详解

    mybatis使用pagehelper插件过程详解

    这篇文章主要介绍了mybatis使用pagehelper插件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java Exception异常全方面分析

    Java Exception异常全方面分析

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等
    2022-03-03
  • 浅谈JDK、JRE、JVM三者之间的关系

    浅谈JDK、JRE、JVM三者之间的关系

    本文主要介绍了浅谈JDK、JRE、JVM三者之间的关系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java中Thread类详解及常用的方法

    Java中Thread类详解及常用的方法

    在java中谈到线程,必然少不了Thread类,下面这篇文章主要给大家介绍了关于Java中Thread类及常用的方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Java内存模型final的内存语义

    Java内存模型final的内存语义

    这篇文章主要介绍了Java内存模型final的内存语义,上篇介绍volatile的内存语义,本文讲述的是final的内存语义,相比之下,final域的读和写更像是普通变量的访问。下面我们一起来看看文章学校内容吧,需要的朋友可以参考一下
    2021-11-11
  • 解决IDEA修改 .vmoptions 文件后导致无法启动的问题

    解决IDEA修改 .vmoptions 文件后导致无法启动的问题

    这篇文章主要介绍了解决IDEA修改 .vmoptions 文件后导致无法启动的问题,需要的朋友可以参考下
    2020-12-12
  • Java可以写android的应用程序吗

    Java可以写android的应用程序吗

    在本篇文章里小编给大家整理的是一篇关于Java可以写android的应用程序吗的相关基础文章,有兴趣的朋友们可以学习下。
    2020-11-11
  • java random随机数的用法及常见应用场景

    java random随机数的用法及常见应用场景

    这篇文章主要给大家介绍了关于java random随机数的用法及常见应用场景的相关资料,Java中的Random类是用来生成伪随机数的工具类,它可以用来生成随机的整数、浮点数和布尔值,需要的朋友可以参考下
    2023-11-11
  • 基于java使用JavaMail发送邮件

    基于java使用JavaMail发送邮件

    这篇文章主要介绍了基于java使用JavaMail发送邮件 ,非常具有实用价值,需要的朋友可以参考下。
    2016-12-12

最新评论