在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」公众号,获知最新一线技术干货!
