Java定时器详解(4种常用定时器方法)

Java定时器详解(4种常用定时器方法)-mikechen

Java定时器在实际的开发中经常使用到,下面我就来详解4种常见的Java定时器实现方式@mikechen

Java定时器定义

Java定时器是一种用于在指定时间间隔,或者特定时间执行任务的工具。

Java定时器主要用于:定时任务调度,例如:定时备份数据库、定时发送邮件、定时清理临时文件等场景。

 

Java定时器的实现方式

目前主要有以下3种实现方式:

1.Timer类

Timer是Java中的一个定时器类,它可以在一定的延迟时间后执行指定的任务。

2.ScheduledExecutorService接口

该接口是JDK 5.0中新增的定时器框架,它使用了线程池来实现定时器的任务执行。

3.Quartz

Quartz是一个功能强大、开源的定时任务调度框架,它可以与Spring框架无缝集成。

4.spring task

spring task是spring 3.0以后推出的定时器类,可以把它当做一个轻量级的quartz。

下面我分别来详解以上4种Java定时器的实现方式@mikechen

 

Java定时器Timer

在JDK中Timer类主要负责计划任务的功能,使用示例如下:

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

public class TimerDemo {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            public void run() {
                System.out.println("定时器任务执行了");
            }
        };
        // 安排定时器任务,在延迟1秒后每隔2秒执行一次
        timer.schedule(task, 1000L, 2000L);
    }
}

上述代码中,首先创建了一个Timer对象,然后创建一个TimerTask对象,其中的run方法就是要定时执行的任务。

接着使用schedule方法,安排定时器任务,在延迟1秒后每隔2秒执行一次。

 

Java定时器Quartz

Quartz需要定义执行任务、触发器,下面是使用Java定时器Quartz实现定时器的示例代码:

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzDemo {
    public static void main(String[] args) throws SchedulerException {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        JobDetail job = JobBuilder.newJob(MyJob.class)
                .withIdentity("job1", "group1")
                .build();
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())
                .build();
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }

    public static class MyJob implements Job {
        public void execute(JobExecutionContext context) throws JobExecutionException {
            System.out.println("定时器任务执行了");
        }
    }
}

上面的代码,大致流程如下:

  1. 首先:创建了一个SchedulerFactory对象,然后使用getScheduler方法获取Scheduler对象。
  2. 接着:创建一个JobDetail对象,表示要执行的定时任务;
  3. 然后:创建一个Trigger对象,表示定时器的调度策略,这里使用SimpleScheduleBuilder来指定定时器的触发方式;
  4. 最后:使用scheduleJob方法将JobDetail和Trigger关联起来,并启动Scheduler。

 

ScheduledExecutorService

下面是使用Java定时器ScheduledExecutorService实现,定时器的示例代码如下:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorServiceDemo {
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        Runnable task = new Runnable() {
            public void run() {
                System.out.println("定时器任务执行了");
            }
        };
        // 安排定时器任务,在延迟1秒后每隔2秒执行一次
        executor.scheduleAtFixedRate(task, 1L, 2L, TimeUnit.SECONDS);
    }
}

上述代码中,大致流程如下:

  1. 首先:创建了一个ScheduledExecutorService对象;
  2. 然后:创建一个Runnable对象,其中的run方法就是要定时执行的任务;
  3. 接着:使用scheduleAtFixedRate方法,安排定时器任务,在延迟1秒后每隔2秒执行一次。

相比于Timer,ScheduledExecutorService更加灵活和高效,因为它是基于线程池的,可以复用线程,避免频繁地创建和销毁线程,从而提高系统性能。

 

Java定时器Spring Task

spring task是spring 3.0以后推出的定时器类,可以把它当做一个轻量级的quartz。

由于配置简单,功能齐全,在实际项目中经常会用到,示例如下:

<bean id="myTask" class="com.example.MyTask" />

<task:scheduled-tasks>
    <task:scheduled ref="myTask" method="run" cron="0 0/5 * * * ?" />
</task:scheduled-tasks>

上面的配置表示每5分钟执行一次MyTask类中的run方法。

以上就是Java定时器的详解,希望对你掌握Java定时器有所帮助。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

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

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

评论交流
    说说你的看法