Java 定时器的多种实现方式

Java 定时器的多种实现方式

前言

在 Java 开发中,我们经常需要编写定时任务,如定时备份、定时发送消息等。这些任务需要在指定时间点或时间间隔内执行。而实现这些定时任务的方法有多种,本文将一一介绍这些方式,包括 Java 内置定时器、定时线程池、Quartz 框架以及 Spring 自带的定时任务。

Java 内置定时器

Java 内置了一个 Timer 类,它允许我们以非常简洁的方式安排定期重复的任务。Timer 定时器是 Java 提供的简单易用的定时任务工具,我们可以使用 Timer 来定时地执行一个任务。下面是一个使用 Timer 的示例代码:

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

public class TimerDemo {

    public static void main(String[] args) {
        Timer timer = new Timer();

        long delay = 0;
        long period = 1000;

        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("Task performed on " + new Date() + "n" +
                    "Thread's name: " + Thread.currentThread().getName());
            }
        }, delay, period);
    }
}

代码功能:使用 Timer 定时器每隔 1 秒输出一次当前时间和线程名。

Timer 定时器最常用方法是 schedule(TimerTask task, long delay) 和 scheduleAtFixedRate(TimerTask task, long delay, long period),分别表示在 delay 时间后执行一次任务和每隔 period 时间执行一次任务。不过需要注意的是,Timer 定时器不是线程安全的,如果需要在多线程环境下使用,建议使用 ScheduledThreadPoolExecutor 代替 Timer 实现定时任务。

定时线程池

与 Timer 不同,定时线程池是线程安全的,也更加灵活。我们可以使用 ScheduledThreadPoolExecutor 类来创建一个定时线程池。下面是一个使用 ScheduledThreadPoolExecutor 的示例代码:

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

public class ScheduledThreadPoolDemo {

    public static void main(String[] args) {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println("Task performed on " + new Date() + "n" +
                    "Thread's name: " + Thread.currentThread().getName());
            }
        }, 0, 1, TimeUnit.SECONDS);
    }
}

代码功能:使用 ScheduledThreadPoolExecutor 定时器每隔 1 秒输出一次当前时间和线程名。

ScheduledThreadPoolExecutor 是线程安全的定时任务实现方式,它的 scheduleAtFixedRate 方法用于按照固定的时间间隔来执行任务。ScheduledThreadPoolExecutor 还提供了 schedule 方法,它能够按照指定的时间来执行任务。

Quartz 框架

Quartz 是一个开源的作业调度框架,它可以与 Java 应用程序集成,从而实现各种复杂的调度需求。Quartz 框架提供了强大的任务调度功能,包括 Cron 表达式、多任务管理、任务监听器等。下面是一个 Quartz 的示例代码:

import java.util.Date;
import org.quartz.CronExpression;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzDemo {

    public static void main(String[] args) {
        try {
            // 创建调度工厂
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            // 获取调度器
            Scheduler scheduler = schedulerFactory.getScheduler();
            // 创建 JobDetail
            JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
                .withIdentity("job1", "group1")
                .build();
            // 创建 Trigger
            CronExpression cron = new CronExpression("0/5 * * * * ?");
            Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();
            // 将 JobDetail 和 Trigger 注册到调度器中
            scheduler.scheduleJob(jobDetail, trigger);
            // 启动调度器
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    public static class QuartzJob implements Job {

        public void execute(JobExecutionContext context) throws JobExecutionException {
            System.out.println("Task performed on " + new Date() + "n" +
                "Thread's name: " + Thread.currentThread().getName());
        }

    }
}

代码功能:使用 Quartz 定时器每隔 5 秒输出一次当前时间和线程名。

Quartz 框架提供了非常完整的定时任务解决方案,包括多种触发器、作业、调度器实现等。我们可以使用 Quartz 框架实现非常复杂的定时任务。

Spring 自带的定时任务

Spring 框架提供了一种非常简单的方法来实现定时任务。我们可以使用 @Scheduled 注解来标注一个方法作为定时任务,然后让 Spring 框架将该方法托管为定时任务。下面是一个 Spring 定时任务的示例代码:

import java.util.Date;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class SpringSchedule {

    @Scheduled(cron = "0/10 * * * * ?")
    public void print() {
        System.out.println("Task performed on " + new Date() + "n" +
            "Thread's name: " + Thread.currentThread().getName());
    }
}

代码功能:使用 Spring 框架实现的定时器每隔 10 秒输出一次当前时间和线程名。

Spring 框架提供了非常方便的方法来实现定时任务。我们只需要在需要定时执行的方法上添加 @Scheduled 注解,然后让 Spring 将其托管为定时任务即可。

总结

本文介绍了 Java 定时器的多种实现方式,包括 Java 内置定时器、定时线程池、Quartz 框架以及 Spring 自带的定时任务。这些实现方式各有特点,我们可以根据具体需求选择适合的方式来实现定时任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 定时器的多种实现方式 - Python技术站

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

相关文章

  • MyBatis通用的10种写法总结大全

    MyBatis通用的10种写法总结大全 1. 基础查询 示例1: xml <select id=”selectById” resultType=”com.example.model.User”> select * from user where id = #{id} </select> 示例2: xml <select id=”…

    Java 2023年5月20日
    00
  • ResourceBundle类在jsp中的国际化实现方法

    ResourceBundle类是Java提供用来访问资源文件(properties文件)的类。在JSP中,我们可以使用ResourceBundle类实现页面的国际化。下面是使用ResourceBundle类在JSP中实现国际化的完整攻略。 步骤一:准备资源文件 在项目的资源目录下,创建多个properties文件,针对不同语言(如中文、英文)分别命名。其中,…

    Java 2023年6月15日
    00
  • Java中的日期时间处理及格式化处理

    Java中的日期时间处理及格式化处理 Java中完整的日期时间处理需要使用到Java.util包和Java.text包的类。日期时间处理主要包括以下内容: 1. Date类 Java中的Date类表示日期和时间的类。它表示的是一个具体的时间点,精度为毫秒级别。常用的方法有: //获取当前时间 Date today = new Date(); //获取时间戳 …

    Java 2023年5月20日
    00
  • java读取resource目录下文件的方法示例

    针对“java读取resource目录下文件的方法示例”,我将为你提供完整的攻略。请仔细阅读以下内容。 方法一:使用ClassLoader.getResource() ClassLoader.getResource() 方法可以帮助我们加载 classpath 中的资源,包括在 resource 目录下的文件。下面是一个简单的示例代码: public cla…

    Java 2023年5月20日
    00
  • java.lang.Void类源码解析

    Java.lang.Void类源码解析 Java.lang.Void类是Java语言中一种特殊的“虚无”类型,该类型用于表示方法没有返回值的情况。本文将解析该类的源代码实现原理。 Void类的定义 Java.lang.Void类是一个final修饰的类,不能被继承。该类的源代码如下所示: public final class Void { /** * The…

    Java 2023年5月26日
    00
  • SpringBoot超详细分析启动流程

    SpringBoot超详细分析启动流程 SpringBoot是一款用于快速构建Spring应用的开源框架。在使用SpringBoot时,了解其启动流程是非常有助于我们理解框架的运行机制和内部实现。 SpringBoot启动流程概述 SpringBoot启动过程分为以下几个关键步骤: 加载SpringApplication类,并创建对应的应用上下文(Appli…

    Java 2023年5月15日
    00
  • java Springboot实现教务管理系统

    下面我将结合一些简单示例,分享一下实现Java Spring Boot教务管理系统的完整攻略。 概述 Java Spring Boot是一个快速开发框架,它可以让我们轻松创建RESTful API应用。教务管理系统是一种基于Web技术的应用程序,可以用于学校的教务管理。Java Spring Boot可以用于构建教务管理系统的后端。 教务管理系统的主要功能包…

    Java 2023年5月19日
    00
  • Java Apache Commons报错“ZipUnsupportedEncryptionMethodException”的原因与解决方法

    “ZipUnsupportedEncryptionMethodException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 压缩加密方法不支持:如果压缩加密方法不支持,则可能会出现此异常。例如,可能会尝试使用不支持的压缩加密方法或压缩文件使用不支持的压缩加密方法。 以下是两个实例: 例1 如果压缩加密方法不支持,则可…

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