Java如何实现定时任务

Java中实现定时任务的方式有多种,主要包括使用Timer和TimerTask类、使用ScheduledExecutorService接口、使用cron表达式和使用Quartz框架。

  1. 使用Timer和TimerTask类

Timer是一种简单的任务调度器,用于按照指定的时间间隔执行任务。TimerTask是Timer中的任务,可以继承TimerTask类并重写run()方法来实现我们需要执行的任务。

示例代码1:

import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行定时任务1");
            }
        };
        // 第一个参数为任务,第二个参数为定时任务第一次执行的延迟时间,第三个参数为两个任务执行的间隔时间
        timer.schedule(task, 0, 1000);
    }
}

示例代码2:

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行定时任务2,时间:" + new Date()); 
            }
        };
        // 第一个参数为任务,第二个参数为定时任务第一次执行的时间
        timer.schedule(task, new Date(System.currentTimeMillis() + 5000)); 
        // 第一个参数为任务,第二个参数为定时任务第一次执行的时间,第三个参数为两个任务执行的间隔时间
        timer.schedule(task, new Date(System.currentTimeMillis() + 5000), 2000); 
    }
}
  1. 使用ScheduledExecutorService接口

ScheduledExecutorService是Java中一个基于线程池设计的定时任务调度器,可以使用它来替代Timer。ScheduledExecutorService提供两种调度方式,分别为按固定时间间隔调度和按固定时间执行。

示例代码3:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorServiceTest {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("执行定时任务3");
            }
        };
        // 第一个参数为任务,第二个参数为任务第一次执行的延迟时间,第三个参数为两个任务执行的间隔时间
        executor.scheduleAtFixedRate(task, 0, 1000, TimeUnit.MILLISECONDS);
    }
}

示例代码4:

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorServiceTest {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("执行定时任务4,时间:" + new Date()); 
            }
        };
        // 第一个参数为任务,第二个参数为任务第一次执行的延迟时间,第三个参数为两个任务执行的间隔时间
        executor.scheduleAtFixedRate(task, 5, 2, TimeUnit.SECONDS);
    }
}
  1. 使用cron表达式

cron表达式是一种通用的时间表达式,可以用于指定各种周期性事件的时间间隔。有两种常见的Java库可以解析cron表达式,分别是Quartz和Spring的Scheduled和SchedulingConfigurer。

示例代码5:

import org.quartz.CronExpression;

import java.util.Date;

public class CronExpressionTest {
    public static void main(String[] args) {
        String cron = "0/5 * * * * ?"; // 每隔5秒执行一次
        CronExpression expression = CronExpression.isValidExpression(cron) ? new CronExpression(cron) : null;
        if (expression != null) {
            Date nextDate = expression.getNextValidTimeAfter(new Date());
            System.out.println(nextDate);
        }
    }
}
  1. 使用Quartz框架

Quartz是一个广泛使用的开源的Job调度框架,提供了很多高级功能。

示例代码6:

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

public class QuartzTest {
    public static void main(String[] args) throws Exception {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("job1", "group1")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
                .build();

        scheduler.scheduleJob(jobDetail, trigger);

        scheduler.start();

        Thread.sleep(10000);

        scheduler.shutdown();
    }

    public static class MyJob implements Job {
        @Override
        public void execute(JobExecutionContext jobExecutionContext) {
            System.out.println("执行Quartz定时任务,时间:" + new Date());
        }
    }
}

以上就是Java实现定时任务的完整攻略,包括几种常见的方式及其示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java如何实现定时任务 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 浅谈java web中常用对象对应的实例化接口

    我们来详细讲解一下“浅谈Java Web中常用对象对应的实例化接口”的完整攻略。 一、Java Web中常用对象的实例化接口 在Java Web开发中,常用的对象包括Servlet、JSP、HttpServletRequest、HttpServletResponse等。这些对象的实例化需要通过相应的接口来完成。 具体来说,常用对象的实例化接口如下: Serv…

    Java 2023年6月15日
    00
  • JSP使用MVC模式完成删除和修改功能实例详解

    我将详细讲解“JSP使用MVC模式完成删除和修改功能实例详解”的完整攻略。 什么是MVC? MVC是Model-View-Controller的缩写,它是一种设计模式,可用于在 Web 应用程序中实现代码和业务逻辑的分离。这样可以增强应用程序的可维护性、可拓展性和可重用性。 其中, Model(模型):存储应用程序的数据内容和业务逻辑。通常使用数据库实现。 …

    Java 2023年6月15日
    00
  • Spring Boot jpa Service层代码实例

    下面我将详细讲解“Spring Boot jpa Service层代码实例”的完整攻略。 什么是Spring Boot jpa Service层 Spring Boot是一个快速开发的框架,它可以轻松地构建基于Spring框架的Web应用程序。而JPA(Java Persistence API)是一种Java EE标准API,用于管理Java对象到关系数据库…

    Java 2023年5月20日
    00
  • Java几个实例带你进阶升华上篇

    这里是完整的 “Java几个实例带你进阶升华上篇” 技术攻略。 1. 概述 本篇攻略主要介绍了 Java 编程语言中的一些进阶技术,采用实例讲解的方式帮助读者深入了解相关技术。 2. 内容 以下是本篇攻略的主要内容: 2.1 数据结构 Java 中常用的数据结构包括数组、链表、栈、队列、哈希表、二叉树等。这些数据结构是程序设计中必不可少的基础。 示例一:实现…

    Java 2023年5月19日
    00
  • Java读取txt文件和写入txt文件的简单实例

    以下是“Java读取txt文件和写入txt文件的简单实例”的完整攻略,包含两条示例。 背景介绍 在Java编程中,有时需要读取或写入文本文件,比如读取配置文件、写入日志等。本篇文章将介绍如何使用Java读取txt文件和写入txt文件,并提供两个简单实例。 读取txt文件示例 读取txt文件的过程需要使用Java的IO流,具体步骤如下: 使用Java的文件输入…

    Java 2023年5月20日
    00
  • Java-SpringBoot-Range请求头设置实现视频分段传输

    老实说,人太懒了,现在基本都不喜欢写笔记了,但是网上有关Range请求头的文章都太水了下面是抄的一段StackOverflow的代码…自己大修改过的,写的注释挺全的,应该直接看得懂,就不解释了写的不好…只是希望能给视频网站开发的新手一点点帮助吧. 业务场景:视频分段传输、视频多段传输(理论上配合前端能实现视频预览功能, 没有尝试过)下面是API测试图…

    Java 2023年4月19日
    00
  • jmeter的时间戳函数使用

    下面是关于jmeter时间戳函数使用的完整攻略: 1. 理解时间戳函数 在JMeter中,我们可以使用时间戳函数来生成当前时间的UNIX时间戳,以及将UNIX时间戳转换为对应的日期时间格式。时间戳是指自1970年1月1日0点0分0秒(格林威治标准时间)以来经过的秒数。使用时间戳函数可以实现生成唯一的随机数、计算业务日期、模拟系统时间等操作。 2. 时间戳函数…

    Java 2023年5月20日
    00
  • 详解SpringMVC @RequestBody接收Json对象字符串

    下面是详解SpringMVC @RequestBody接收Json对象字符串的完整攻略: 一、什么是SpringMVC @RequestBody 在SpringMVC中,@RequestBody注解用于指示方法参数应该来自HTTP请求体。当请求被解析时,映射器将请求体中的JSON字符串转换为指定的Java类型的数据。 二、@RequestBody的使用方法 …

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部