在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面试题总结》