Java 定时器的多种实现方式

yizhihongxing

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日

相关文章

  • 在Win10上安装Tomcat服务器及配置环境变量的详细教程(图文)

    在Win10上安装Tomcat服务器及配置环境变量的详细教程: 准备工作 官方网站下载Tomcat服务器压缩文件,例如tomcat-8.5.57.tar.gz 安装JDK,推荐版本为JDK8或JDK11,JDK11及以上版本,Tomcat需版本在9及以上 确认JDK环境变量已配置 安装Tomcat 解压Tomcat服务器压缩文件到指定目录。例如,将压缩文件解…

    Java 2023年5月19日
    00
  • Tomcat配置JMX远程连接的详细操作

    下面将详细讲解Tomcat配置JMX远程连接的操作步骤。 一、在Java环境变量中配置JMX参数 在Java环境变量中配置以下参数,用于开启JMX远程服务: -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.1 -Dcom.sun.management.jmxremote.…

    Java 2023年5月19日
    00
  • JavaBean四个作用域范围的详解

    JavaBean四个作用域范围的详解 JavaBean是指一种符合特定规范的Java类,通常被设计用于传递数据,其中,JavaBean的四个作用域范围是指该JavaBean所处的生命周期不同阶段中,可以被访问的范围。JavaBean的四个作用域范围分别是:request、session、application和pageContext。下面将对这四个作用域分别…

    Java 2023年6月15日
    00
  • Spring Security源码解析之权限访问控制是如何做到的

    首先,Spring Security是一个基于Spring框架的安全框架,它提供了身份认证和授权等功能,帮助我们防止各种安全攻击,保障我们的应用程序安全。 Spring Security的权限访问控制是通过访问控制表达式来实现的,可以在配置文件中配置。访问控制表达式包含了许多参数和操作符,用于判断用户是否有权访问特定的资源。具体来说,Spring Secur…

    Java 2023年5月20日
    00
  • springboot 整合邮件发送功能

    整合邮件发送功能是 Spring Boot 中常见的应用场景之一。下面是整合邮件发送功能的完整攻略: 步骤一:添加邮件依赖 在 pom.xml 文件中添加以下依赖,在这个依赖中包含了spring-boot-starter-mail的所有依赖。 <dependency> <groupId>org.springframework.boot…

    Java 2023年6月15日
    00
  • Java的Struts框架报错“ActionServletMappingException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionServletMappingException”错误。这个错误通常由以下原因之一起: ServletMapping配置错误:如果配置文件中没有正确ServletMapping,则可能会现此错误。在这种情况下,需要检查文件以解决此问题。 ServletMapping无效:如果ServletMappin…

    Java 2023年5月5日
    00
  • Java 汇编JVM编写jasmin程序的操作方法

    Java汇编是一种利用Jasmin工具编写JVM汇编代码的技术。在Java虚拟机中,Jasmin程序就相当于Java程序源代码,可以通过JVM将其转化为可执行的二进制代码。以下是Java汇编JVM编写jasmin程序的完整实现攻略。 步骤一:安装Jasmin Jasmin是一个免费的开源工具,可以从其官方网站下载最新版本:http://jasmin.sour…

    Java 2023年5月23日
    00
  • java实现输出任意整数的每一位

    下面是java实现输出任意整数的每一位的完整攻略。 步骤一:将整数转成字符串 我们知道,字符串中每个字符都可以通过下标访问。所以,我们只需要将整数转换成字符串,就可以通过下标依次访问每个数字了。 int num = 123456; String numStr = String.valueOf(num); // 将整数转换成字符串 步骤二:遍历字符串,输出每一…

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