任务调度(一)——jdk自带的Timer
2015-05-08 09:19
393 查看
说到任务调度,大家可能会想到Quartz框架,但是jdk自带的简单任务调度工具类,反而了解的人并不是很多。我觉得如果你的业务相对简单的话,没必要非得用Quartz等框架,使用Timer完全可以胜任的。简单来分享一下我了解的Timer。
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
我是用TimerTask来创建一个任务,其中run方法里是任务调度的逻辑。使用一个Timer对象来调度任务。
首先给一个特别简单的示例:
[java]
view plaincopy
package com.tgb.ccl.schema;
import java.util.Date;
import java.util.TimerTask;
/**
* 不可动态修改的任务
*
* @author arron
* @date 2015年5月7日 下午1:52:15
* @version 1.0
*/
public class FixedTimerTask extends TimerTask{
@Override
public void run() {
Date d = new Date();
for(int i=0;i<3;i++){
try {
Thread.sleep(1000);
System.out.println("已执行【"+(i+1)+"】秒钟,at: "+d.toLocaleString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("本次任务调度结束,at: "+new Date().toLocaleString());
System.out.println("---------------------------");
}
}
[java]
view plaincopy
package com.tgb.ccl.schema;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
/**
* 任务调度管理器
*
* @author arron
* @date 2015年5月7日 下午1:57:19
* @version 1.0
*/
public class TaskManager {
// private static final long PERIOD = 5 * 60 * 1000;// 5分钟
private static final long PERIOD = 5 * 1000;// 1秒钟
public TaskManager() {
Timer timer = new Timer();
FixedTimerTask task = new FixedTimerTask();
System.out.println("start");
//0表示立即执行一次,以后每隔一段时间执行一次
timer.schedule(task, 0, PERIOD);
//1000表示1秒后执行一次,以后每隔一段时间执行一次
//timer.schedule(task, 1000, PERIOD);
//0表示立即执行一次,以后每隔一段时间执行一次
//timer.schedule(task, 1000, PERIOD);
// 在当天14点4分整,执行一次,以后不再执行
//timer.schedule(task, bookTime(15,0,0));
//在当天14点4分整,执行一次,以后每隔一段时间执行一次
//如果时间超过了设定时间,会立即执行一次
// timer.schedule(task, bookTime(0,34,10),PERIOD);
// timer.scheduleAtFixedRate(task, bookTime(0,40,0),PERIOD);
}
private Date bookTime(int hour, int minute, int second) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
Date date = calendar.getTime();
return date;
}
public static void main(String[] args) {
new TaskManager();
}
}
只要执行main方法就可以测试了。
大家可能已经注意到了,timer的schedule方法是重载的。参数主要有必须有一个TimerTask实例。第二个参数如果是long类型的,这个参数则是表示延迟时间,以毫秒为单位。如果为1000,那就是1秒后执行任务调度。如果是Date类型,则表示设定任务开始执行的时刻。当时间到达这个时刻,那么任务会自动开始调度。当然如果当前时间已经超过了设定的开始时间,那么会立即执行一次。第三个参数则是可选参数,是long类型的参数,表示调度的间隔时间。如果有这个参数,表示任务是重复性的调度。否则只会执行一次。这个参数依旧以毫秒为单位。
如果你稍微注意一下,就会发现timer不只提供了schedule方法,还提供了scheduleAtFixedRate方法。这两个方法都是任务调度方法,他们有什么区别呢?
区别在于当当前时间已经超过了设定执行时间,schedule方法会立即执行,第二次执行则是按当前执行时间+间隔时间来算的(当然任务执行时间超过了间隔时间,则在第一次执行完毕后,立马会执行第二次)。而scheduleAtFixedRate方法,同样是立即执行一次,但是它第二次执行则是按照(当前执行时间-设定的时间)/时间间隔来计算从设定时间到现在还需要执行多少次。
举个例子:任务调度需要执行2s,间隔时间是10s,我设定的是8点执行。当前时间为8点0分10秒,如果是schedule方法,则会立即执行一次,第二次执行时间则是08:00:20。如果是scheduleAtFixedRate方法,则会立即执行一次,然后计算08:00:10-08:00:00整好还可以执行一次,所以会在08:00:12时,会立即再执行一次,第三次执行则是在08:00:20时执行,以后每隔10s执行一次。
(左图是schedule方法的测试效果,右图是scheduleAtFixedRate方法的测试效果)
这个跟网上很多人说的不太一样。不过这个是我测试出来了。他们说的那种结果反正我是测不出来。具体你相信哪种,你自己试过就清楚了。
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
我是用TimerTask来创建一个任务,其中run方法里是任务调度的逻辑。使用一个Timer对象来调度任务。
首先给一个特别简单的示例:
[java]
view plaincopy
package com.tgb.ccl.schema;
import java.util.Date;
import java.util.TimerTask;
/**
* 不可动态修改的任务
*
* @author arron
* @date 2015年5月7日 下午1:52:15
* @version 1.0
*/
public class FixedTimerTask extends TimerTask{
@Override
public void run() {
Date d = new Date();
for(int i=0;i<3;i++){
try {
Thread.sleep(1000);
System.out.println("已执行【"+(i+1)+"】秒钟,at: "+d.toLocaleString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("本次任务调度结束,at: "+new Date().toLocaleString());
System.out.println("---------------------------");
}
}
[java]
view plaincopy
package com.tgb.ccl.schema;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
/**
* 任务调度管理器
*
* @author arron
* @date 2015年5月7日 下午1:57:19
* @version 1.0
*/
public class TaskManager {
// private static final long PERIOD = 5 * 60 * 1000;// 5分钟
private static final long PERIOD = 5 * 1000;// 1秒钟
public TaskManager() {
Timer timer = new Timer();
FixedTimerTask task = new FixedTimerTask();
System.out.println("start");
//0表示立即执行一次,以后每隔一段时间执行一次
timer.schedule(task, 0, PERIOD);
//1000表示1秒后执行一次,以后每隔一段时间执行一次
//timer.schedule(task, 1000, PERIOD);
//0表示立即执行一次,以后每隔一段时间执行一次
//timer.schedule(task, 1000, PERIOD);
// 在当天14点4分整,执行一次,以后不再执行
//timer.schedule(task, bookTime(15,0,0));
//在当天14点4分整,执行一次,以后每隔一段时间执行一次
//如果时间超过了设定时间,会立即执行一次
// timer.schedule(task, bookTime(0,34,10),PERIOD);
// timer.scheduleAtFixedRate(task, bookTime(0,40,0),PERIOD);
}
private Date bookTime(int hour, int minute, int second) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
Date date = calendar.getTime();
return date;
}
public static void main(String[] args) {
new TaskManager();
}
}
只要执行main方法就可以测试了。
大家可能已经注意到了,timer的schedule方法是重载的。参数主要有必须有一个TimerTask实例。第二个参数如果是long类型的,这个参数则是表示延迟时间,以毫秒为单位。如果为1000,那就是1秒后执行任务调度。如果是Date类型,则表示设定任务开始执行的时刻。当时间到达这个时刻,那么任务会自动开始调度。当然如果当前时间已经超过了设定的开始时间,那么会立即执行一次。第三个参数则是可选参数,是long类型的参数,表示调度的间隔时间。如果有这个参数,表示任务是重复性的调度。否则只会执行一次。这个参数依旧以毫秒为单位。
如果你稍微注意一下,就会发现timer不只提供了schedule方法,还提供了scheduleAtFixedRate方法。这两个方法都是任务调度方法,他们有什么区别呢?
区别在于当当前时间已经超过了设定执行时间,schedule方法会立即执行,第二次执行则是按当前执行时间+间隔时间来算的(当然任务执行时间超过了间隔时间,则在第一次执行完毕后,立马会执行第二次)。而scheduleAtFixedRate方法,同样是立即执行一次,但是它第二次执行则是按照(当前执行时间-设定的时间)/时间间隔来计算从设定时间到现在还需要执行多少次。
举个例子:任务调度需要执行2s,间隔时间是10s,我设定的是8点执行。当前时间为8点0分10秒,如果是schedule方法,则会立即执行一次,第二次执行时间则是08:00:20。如果是scheduleAtFixedRate方法,则会立即执行一次,然后计算08:00:10-08:00:00整好还可以执行一次,所以会在08:00:12时,会立即再执行一次,第三次执行则是在08:00:20时执行,以后每隔10s执行一次。
(左图是schedule方法的测试效果,右图是scheduleAtFixedRate方法的测试效果)
这个跟网上很多人说的不太一样。不过这个是我测试出来了。他们说的那种结果反正我是测不出来。具体你相信哪种,你自己试过就清楚了。
相关文章推荐
- 任务调度(二)——jdk自带的Timer 动态修改任务执行计划
- 任务调度(二)——jdk自带的Timer 动态修改任务执行计划
- 任务调度(一)——jdk自带的Timer
- 任务调度(一)——jdk自带的Timer
- JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche
- Jdk自带的定时任务TimerTask和ScheduledExecutorService及其在Spring中的集成
- spring任务调度方法之JDK Timer
- 《pro Spring》学习笔记之使用JDK Timer调度任意任务
- 任务调度——java.util.Timer
- 任务调度(四)——ScheduledExecutorService替代Timer,实现多线程任务调度
- spring自带任务调度-注解方式
- 任务调度 ----Timer+quartz
- java定时任务,每天定时执行任务(JDK TimerTask)
- 任务调度--使用java.util.Timer实现
- 任务调度(四)——ScheduledExecutorService替代Timer,实现多线程任务调度
- 【springboot】【任务调度】 自带任务调度和quartz
- Android实现调度任务的三种方式:TimerTask、ScheduledExecutorService、Handler
- Spring任务调度实战之Timer
- 使用Timer类去调度任务——java
- 任务调度--使用java.util.Timer实现