Java中简单定时任务的实现

简介: 在 Java 中实现定时任务有多种方式,每种方式的原理和适用场景不同。`java.util.Timer` 和 `TimerTask` 通过单线程执行任务,适合简单场景;`ScheduledExecutorService` 基于线程池,支持多线程并发,更加灵活和健壮;三种方式各有优劣,开发者可根据需求选择合适的方案。

在 Java 里实现简单定时任务有多种方式,不同方式的原理也有所不同

  1. java.util.Timer 和 java.util.TimerTask
    实现原理
    Timer 类是 Java 提供的一个定时器工具,它内部持有一个任务队列和一个后台线程。TimerTask 是一个抽象类,代表一个可以被 Timer 执行的定时任务。当创建一个 Timer 对象时,它会启动一个后台线程,这个线程会不断地从任务队列中取出任务并执行。
    任务调度:使用 Timer 的 schedule() 或 scheduleAtFixedRate() 等方法可以将 TimerTask 任务添加到任务队列中,并指定任务的执行时间和周期。Timer 会根据任务的执行时间对任务进行排序,保证先到期的任务先执行。
    线程安全:Timer 内部的任务队列是线程安全的,因为 Timer 在操作任务队列时会进行同步处理,确保多线程环境下任务的正确调度。
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("定时任务执行了,当前时间:" + System.currentTimeMillis());
            }
        };
        // 延迟 1 秒后开始执行,每隔 2 秒执行一次
        timer.schedule(task, 1000, 2000);
    }
}
  1. ScheduledExecutorService

实现原理
ScheduledExecutorService 是 Java 并发包(java.util.concurrent)提供的一个接口,用于创建定时任务。它基于线程池的原理,内部维护了一个线程池来执行定时任务。相比于 Timer,ScheduledExecutorService 更加灵活和强大,因为它支持多线程并发执行任务,并且对异常的处理更加健壮。
任务调度:通过 ScheduledExecutorService 的 schedule()、scheduleAtFixedRate() 和 scheduleWithFixedDelay() 等方法可以将任务提交到线程池中,并指定任务的执行时间和周期。线程池会根据任务的调度规则,在合适的时间执行任务。
线程管理:ScheduledExecutorService 会自动管理线程的生命周期,包括线程的创建、销毁和复用。当任务执行完成后,线程会返回到线程池中等待下一个任务,提高了资源的利用率。

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.newScheduledThreadPool(1);
        Runnable task = () -> System.out.println("定时任务执行了,当前时间:" + System.currentTimeMillis());
        // 延迟 1 秒后开始执行,每隔 2 秒执行一次
        executor.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
    }
}
  1. Spring 的 @Scheduled 注解

实现原理
Spring 框架提供了 @Scheduled 注解来简化定时任务的开发。它基于 Spring 的 AOP(面向切面编程)和任务调度器实现。
AOP 代理:当在 Spring 管理的 Bean 中使用 @Scheduled 注解时,Spring 会使用 AOP 为该 Bean 创建一个代理对象。在代理对象中,会拦截被 @Scheduled 注解标记的方法,并根据注解中指定的调度规则进行任务调度。
任务调度器:Spring 内部使用 TaskScheduler 作为任务调度器,默认情况下使用 ThreadPoolTaskScheduler。TaskScheduler 会根据 @Scheduled 注解中的配置,将任务添加到任务队列中,并在合适的时间执行任务。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SpringScheduledTask {
    @Scheduled(fixedRate = 2000) // 每隔 2 秒执行一次
    public void executeTask() {
        System.out.println("定时任务执行了,当前时间:" + System.currentTimeMillis());
    }
}
相关文章
|
9月前
|
Java 调度 Spring
Java中几种定时任务使用与详解
Java中几种定时任务使用与详解
115 0
|
8月前
|
Java jenkins 持续交付
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
407 3
|
4月前
|
Java
用java搞定时任务,将hashmap里面的值存到文件里面去
本文介绍了如何使用Java的`Timer`和`TimerTask`类创建一个定时任务,将HashMap中的键值对写入到文本文件中,并提供了完整的示例代码。
53 1
用java搞定时任务,将hashmap里面的值存到文件里面去
|
4月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
195 1
|
算法 Java Linux
Java线程常用定时任务算法与应用
Java线程常用定时任务算法与应用
130 0
|
7月前
|
Java 调度
java定时任务3分钟一次
7月更文挑战第6天
290 1
|
7月前
|
负载均衡 Java 调度
Java中的定时任务实现详解
Java中的定时任务实现详解
|
7月前
|
Java 调度 Spring
Java中的定时任务调度与管理
Java中的定时任务调度与管理
|
7月前
|
监控 Java 调度
使用Java实现高性能的定时任务调度
使用Java实现高性能的定时任务调度
|
8月前
|
XML Java 数据格式
一篇文章讲明白java的常用定时任务的几种方式
一篇文章讲明白java的常用定时任务的几种方式
58 0