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("定时器任务执行了"); } } }
上面的代码,大致流程如下:
- 首先:创建了一个SchedulerFactory对象,然后使用getScheduler方法获取Scheduler对象。
- 接着:创建一个JobDetail对象,表示要执行的定时任务;
- 然后:创建一个Trigger对象,表示定时器的调度策略,这里使用SimpleScheduleBuilder来指定定时器的触发方式;
- 最后:使用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); } }
上述代码中,大致流程如下:
- 首先:创建了一个ScheduledExecutorService对象;
- 然后:创建一个Runnable对象,其中的run方法就是要定时执行的任务;
- 接着:使用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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》