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

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

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

1.使用java.util.Timer

示例:

  1. import java.util.Timer;
  2. import java.util.TimerTask;
  3.  
  4. public class TimerTaskExample {
  5. public static void main(String[] args) {
  6. Timer timer = new Timer();
  7. TimerTask task = new TimerTask() {
  8. @Override
  9. public void run() {
  10. // 在这里编写定时任务的逻辑
  11. System.out.println("定时任务执行了");
  12. }
  13. };
  14.  
  15. // 安排任务在延迟1秒后开始执行,并且每隔5秒执行一次
  16. timer.schedule(task, 1000, 5000);
  17. }
  18. }

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

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

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

 

2.使用ScheduledExecutorService

因 Timer 有一些缺陷,所以不太建议使用 Timer,推荐使用 ScheduledExecutorService。

示例:

  1. import java.util.concurrent.Executors;
  2. import java.util.concurrent.ScheduledExecutorService;
  3. import java.util.concurrent.TimeUnit;
  4.  
  5. public class ScheduledExecutorServiceExample {
  6. public static void main(String[] args) {
  7. ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
  8. Runnable task = new Runnable() {
  9. @Override
  10. public void run() {
  11. // 在这里编写定时任务的逻辑
  12. System.out.println("定时任务执行了");
  13. }
  14. };
  15.  
  16. // 安排任务在延迟1秒后开始执行,并且每隔5秒执行一次
  17. executor.scheduleAtFixedRate(task, 1, 5, TimeUnit.SECONDS);
  18. }
  19. }

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

 

3.使用Spring框架注解

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

  1. import org.springframework.scheduling.annotation.Scheduled;
  2. import org.springframework.stereotype.Component;
  3.  
  4. @Component
  5. public class ScheduledTask {
  6.  
  7. // 每隔5秒执行一次任务
  8. @Scheduled(fixedRate = 5000)
  9. public void runTask() {
  10. // 在这里编写定时任务的逻辑
  11. System.out.println("定时任务执行了");
  12. }
  13.  
  14. // 每天凌晨1点执行任务
  15. @Scheduled(cron = "0 0 1 * * ?")
  16. public void runTaskAtMidnight() {
  17. // 在这里编写定时任务的逻辑
  18. System.out.println("每天凌晨1点定时任务执行了");
  19. }
  20. }

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

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

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

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

 

4.使用Quartz调度框架

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

  1. import org.quartz.Job;
  2. import org.quartz.JobExecutionContext;
  3. import org.quartz.JobExecutionException;
  4. import org.quartz.Scheduler;
  5. import org.quartz.SchedulerException;
  6. import org.quartz.Trigger;
  7. import org.quartz.TriggerBuilder;
  8. import org.quartz.impl.StdSchedulerFactory;
  9.  
  10. public class QuartzSchedulerExample {
  11. public static void main(String[] args) {
  12. try {
  13. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  14. scheduler.start();
  15.  
  16. Job job = new Job() {
  17. @Override
  18. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  19. // 在这里编写定时任务的逻辑
  20. System.out.println("定时任务执行了");
  21. }
  22. };
  23.  
  24. Trigger trigger = TriggerBuilder.newTrigger()
  25. .startNow()
  26. .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
  27. .build();
  28.  
  29. scheduler.scheduleJob(job, trigger);
  30. } catch (SchedulerException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }

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

mikechen

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

关注「mikechen」公众号,获知最新一线技术干货!

评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!