Java定时任务详解(4种主流实现方式)

Java定时任务详解(4种主流实现方式)-mikechen

在Java中有多种实现定时任务的方式,以下是4种常见的Java定时任务实现方式。

1.使用java.util.Timer

示例:

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

public class TimerTaskExample {
    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);
    }
}

这种实现方式比较简单,可以指定首次执行的延迟时间、首次执行的具体日期时间,以及执行频率,能满足日常需要。

另外,需要注意的是,Timer 是线程安全的,因为背后是单线程在执行所有任务。

Timer 不会捕获异常,如果 A,B,C 任何一个任务在执行过程中发生异常,就会导致 TImer 整个定时任务停止工作。

 

2.使用ScheduledExecutorService

因 Timer 有一些缺陷,所以不太建议使用 Timer,推荐使用 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 = new Runnable() {
            @Override
            public void run() {
                // 在这里编写定时任务的逻辑
                System.out.println("定时任务执行了");
            }
        };

        // 安排任务在延迟1秒后开始执行,并且每隔5秒执行一次
        executor.scheduleAtFixedRate(task, 1, 5, TimeUnit.SECONDS);
    }
}

ScheduledExecutorService 即是 Timer 的替代者,JDK 1.5 并发包引入,是基于线程池设计的定时任务类来实现。

 

3.使用Spring框架注解

也可以使用Spring框架的@Scheduled注解来实现定时任务,示例如下:

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

@Component
public class ScheduledTask {

    // 每隔5秒执行一次任务
    @Scheduled(fixedRate = 5000)
    public void runTask() {
        // 在这里编写定时任务的逻辑
        System.out.println("定时任务执行了");
    }

    // 每天凌晨1点执行任务
    @Scheduled(cron = "0 0 1 * * ?")
    public void runTaskAtMidnight() {
        // 在这里编写定时任务的逻辑
        System.out.println("每天凌晨1点定时任务执行了");
    }
}

在上述示例中,ScheduledTask类被注解为@Component,以便Spring能够扫描并创建实例。

然后,通过@Scheduled注解标记了两个方法:runTask()runTaskAtMidnight()

runTask()方法使用fixedRate属性,表示每隔5秒执行一次任务。

runTaskAtMidnight()方法使用cron属性,指定了一个Cron表达式,用于在每天凌晨1点执行任务。

 

4.使用Quartz调度框架

也可以使用Quartz调,度框架来实现Java定时任务,示例如下:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzSchedulerExample {
    public static void main(String[] args) {
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            Job job = new Job() {
                @Override
                public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
                    // 在这里编写定时任务的逻辑
                    System.out.println("定时任务执行了");
                }
            };

            Trigger trigger = TriggerBuilder.newTrigger()
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
                    .build();

            scheduler.scheduleJob(job, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

以上是四种常见的Java定时任务实现方式,可以根据具体需求选择适合的方式来实现定时任务。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法