
在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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。