自学内容网 自学内容网

JAVA |日常开发中定时任务详解

在这里插入图片描述
在这里插入图片描述

JAVA |日常开发中定时任务详解

  • 前言
  • 一、定时任务概述
    • 1.1 定义
    • 1.2 应用场景
  • 二、使用java.util.Timer和TimerTask实现定时任务
    • 2.1 Timer类和TimerTask类简介
    • 2.2 示例代码 - 简单的定时执行任务
    • 2.3 示例代码 - 固定间隔重复执行任务
    • 2.4 Timer和TimerTask的局限性
  • 三、使用ScheduledExecutorService实现定时任务
    • 3.1 ScheduledExecutorService简介
    • 3.2 示例代码 - 延迟执行任务
    • 3.3 示例代码 - 固定频率重复执行任务
    • 3.4 示例代码 - 固定延迟重复执行任务
    • 3.5 ScheduledExecutorService的优势
  • 四、使用第三方框架实现定时任务(以 Quartz 为例)
    • 4.1 Quartz 简介
    • 4.2 Quartz 的核心概念
    • 4.3示例代码 - 使用 Quartz 实现简单定时任务
    • 4.4 使用 cron 表达式实现复杂调度规则
  • 结束语
  • 优质源码分享

JAVA |日常开发中定时任务详解,在日常的Java开发中,定时任务是一个非常重要的功能,它允许我们在特定的时间点或时间间隔内自动执行某些任务。这对于需要周期性处理数据的系统,如数据备份、日志清理、定时推送等场景非常有用。本文将详细介绍Java中实现定时任务的几种常用方法,包括基本概念、使用示例以及注意事项。

前言

        在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。

一、定时任务概述

1.1 定义

    在 Java 日常开发中,定时任务是指按照预定的时间间隔或特定时间点自动执行的任务。这些任务可以是简单的方法调用,如发送定时提醒邮件、数据备份,也可以是复杂的业务逻辑处理。

1.2 应用场景

    数据清理与维护:定期清理数据库中的过期数据、日志文件,以释放存储空间并保持系统的高效运行。例如,每天凌晨 2 点删除数据库中超过 30 天的历史订单记录。
    系统监控与报告:定时收集系统的性能指标(如 CPU 使用率、内存占用等),并生成报告。可以每隔 15 分钟获取一次数据并进行汇总。
    消息推送与提醒:按照用户设定的时间发送通知消息,如定时提醒用户参加会议、完成任务等。

二、使用java.util.Timer和TimerTask实现定时任务

2.1 Timer类和TimerTask类简介

    Timer类是一个工具类,用于安排任务在未来的某个时间点执行,或者按照固定的间隔重复执行。TimerTask是一个抽象类,代表一个可以被Timer执行的任务,需要继承它并实现run方法来定义具体的任务内容。

2.2 示例代码 - 简单的定时执行任务

    以下代码实现了一个简单的定时任务,任务会在延迟 3 秒后执行一次。

import java.util.Timer;
import java.util.TimerTask;
public class TimerExample {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时任务执行");
            }
        };
        // 延迟3秒后执行任务
        timer.schedule(task, 3000);
    }
}

2.3 示例代码 - 固定间隔重复执行任务

    这个示例展示了如何让任务每隔 5 秒重复执行一次。

import java.util.Timer;
import java.util.TimerTask;
public class TimerRepeatExample {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("定时任务执行");
            }
        };
        // 延迟1秒后开始执行,之后每隔5秒执行一次
        timer.schedule(task, 1000, 5000);
    }
}

2.4 Timer和TimerTask的局限性

    单线程执行:Timer是单线程的,如果一个任务执行时间过长,会影响后续任务的按时执行。例如,如果一个定时任务需要执行 10 秒,而间隔设置为 5 秒,那么下一个任务将会延迟 5 秒才开始执行。
    异常处理问题:如果TimerTask中的run方法抛出未捕获的异常,Timer会终止整个定时任务序列,导致后续任务无法执行。

三、使用ScheduledExecutorService实现定时任务

3.1 ScheduledExecutorService简介

ScheduledExecutorService是ExecutorService的子接口,它提供了更灵活和强大的定时任务调度功能。它基于线程池实现,可以有效地管理多个定时任务,并且能够更好地处理任务执行中的异常情况。

3.2 示例代码 - 延迟执行任务

下面的代码展示了如何使用ScheduledExecutorService延迟 3 秒执行一个任务。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorServiceExample {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("定时任务执行");
            }
        };
        // 延迟3秒后执行任务
        executor.schedule(task, 3, TimeUnit.SECONDS);
        // 关闭线程池,防止程序不退出
        executor.shutdown();
    }
}

3.3 示例代码 - 固定频率重复执行任务

此示例实现了让任务每隔 5 秒重复执行一次。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorServiceRepeatExample {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("定时任务执行");
            }
        };
        // 延迟1秒后开始执行,之后每隔5秒执行一次
        executor.scheduleAtFixedRate(task, 1, 5, TimeUnit.SECONIC);
        // 关闭线程池,防止程序不退出
        executor.shutdown();
    }
}

3.4 示例代码 - 固定延迟重复执行任务

与固定频率执行不同,固定延迟执行是指当前任务执行完成后,经过固定的延迟时间再执行下一个任务。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorServiceFixedDelayExample {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("定时任务执行");
            }
        };
        // 延迟1秒后开始执行,之后每个任务完成后延迟5秒执行下一个任务
        executor.scheduleWithFixedDelay(task, 1, 5, TimeUnit.SECONDS);
        // 关闭线程池,防止程序不退出
        executor.shutdown();
    }
}

3.5 ScheduledExecutorService的优势

    基于线程池:可以利用线程池的优势,如资源复用、更好地控制并发度等。即使一个任务执行时间过长,也不会影响其他任务的调度,因为它是基于多线程的。
    强大的异常处理机制:当任务抛出异常时,不会像Timer那样导致整个定时任务序列终止,而是可以继续执行其他任务。同时,可以在任务执行代码中捕获和处理异常,以确保系统的稳定性。

四、使用第三方框架实现定时任务(以 Quartz 为例)

4.1 Quartz 简介

    Quartz 是一个功能强大的开源任务调度框架,它提供了丰富的功能,如复杂的调度规则(如 cron 表达式)、任务持久化、集群支持等。它在企业级应用开发中被广泛使用,适用于处理复杂的定时任务场景。

4.2 Quartz 的核心概念

  • Job:代表一个具体的任务,需要实现Job接口的execute方法来定义任务内容。
  • Trigger:用于定义任务的触发规则,如简单的时间间隔触发、基于 cron 表达式的复杂触发等。
  • Scheduler:是 Quartz 的核心调度器,负责管理任务和触发规则,将任务按照触发规则进行调度执行。

4.3示例代码 - 使用 Quartz 实现简单定时任务

    首先,需要添加 Quartz 的依赖到项目中(以 Maven 为例)。

<dependency>
    <groupId>org.quartz - scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

    以下是一个简单的 Quartz 定时任务示例,任务会每隔 5 秒执行一次。

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class QuartzExample implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Quartz定时任务执行,时间: " + new Date());
    }
    public static void main(String[] args) throws SchedulerException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        org.quartz.JobDetail job = new org.quartz.JobDetail("job1", "group1", QuartzExample.class);
        org.quartz.SimpleTrigger trigger = new org.quartz.SimpleTrigger("trigger1", "group1");
        trigger.setRepeatInterval(5000);
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}

4.4 使用 cron 表达式实现复杂调度规则

    cron 表达式是一种强大的时间表达式,用于精确地定义任务的执行时间。例如,0 0 12 * *?表示每天中午 12 点执行任务。
    以下示例使用 cron 表达式来调度任务,让任务在每天上午 9 点 30 分执行。

import org.quartz.CronExpression;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import java.text.ParseException;
import java.util.Date;
public class QuartzCronExample implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Quartz定时任务(cron表达式)执行,时间: " + new Date());
    }
    public static void main(String[] args) throws SchedulerException, ParseException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        org.quartz.JobDetail job = new org.quartz.JobDetail("job1", "group1", QuartzCronExample.class);
        CronExpression cronExpression = new CronExpression("0 30 9 * *?");
        org.quartz.CronTrigger trigger = new org.quartz.CronTrigger("trigger1", "group1", cronExpression);
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}

结束语

        亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

         愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

        至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


--------------- 业精于勤,荒于嬉 ---------------
 

请添加图片描述

--------------- 行成于思,毁于随 ---------------

优质源码分享


在这里插入图片描述


     💞 关注博主 带你实现畅游前后端

     🏰 大屏可视化 带你体验酷炫大屏

     💯 神秘个人简介 带你体验不一样得介绍

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有)https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/144187434(防止抄袭,原文地址不可删除)


原文地址:https://blog.csdn.net/weixin_43151418/article/details/144187434

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!