·介绍
从实现的技术上来看,目前主要有以下三种方式:
- Java自带工具实现:使用这种方式可以让你的程序按照某一个频度执行。本文将介绍两种方式(Timer、ScheduledExecutorService)。
- 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
- SpringTask,Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
·实现
方法一:Java自带工具实现
Timer(java.util.Timer)
Timer有两种方法schedule和scheduleAtFixedRate实现定时任务。注意:Timer会在任务开始就计算时间。
Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,上一个任务执行结束才会接着执行下一个任务,前一个任务的延迟或异常都将会影响到之后的任务。
// schedule方法。 解释:1000ms是延迟启动时间;2000ms是定时任务周期,每2s执行一次
new Timer("testTimer").schedule(new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask");
}
}, 1000,2000);
// scheduleAtFixedRate方法。 date是开始时间,2000ms是定时任务周期,每2s执行一次
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
Date date = dateFormat.parse("2019-06-18 12:00:00.000");
new Timer("testTimer1").scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask");
}
}, date,2000);
} catch (ParseException e) {
e.printStackTrace();
}
ScheduledExecutorService(线程池)
ScheduledExecutorService有三个常用方法:schedule、scheduleAtFixedRate、scheduleWithFixedDelay。直接上代码。
// schedule方法。 延迟1s启动,执行一次
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("ScheduledTask");
}
},1, TimeUnit.SECONDS);
//scheduleAtFixedRate方法。 延迟1s启动,每隔2s执行一次。
//前一个任务开始时就计算时间间隔,但是会等上一个任务结束才开始下一个任务
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("ScheduledTask");
}
}, 1, 2, TimeUnit.SECONDS);
// scheduleWithFixedDelay方法。 延迟1s启动,在上一个任务执行完成之后&