Timer的定时调度函数
一、schedule的四种用法
1.schedule(task,time)
参数
task:所要安排的任务
time:执行任务的时间
作用
在时间等于或者超过time的时候执行且仅执行一次task
等于或者超过time:
如果time是晚于现在的时间,那么当schedule上之后(执行schedule方法),time的后台线程就会一直等待着;
当现在的时间等于time的时候:
就会去执行task里面的内容;对于超过的情况,比如time是早于现在的时间,一旦schedule上,后台线程就会立即执行task的内容
2.schedule(task, time, period)
参数
task:所要安排的任务
time:首次执行任务的时间
period:执行一次task的时间间隔,单位是毫秒
作用
时间等于或者超过time时首次执行task
之后每隔period毫秒重复执行一次task
3.schedule(task, delay)
参数
task:所要安排的任务
delay:执行任务前的延迟时间,单位是毫秒
作用
等待delay毫秒后仅执行且执行一个task
4.schedule(task, delay, period)
参数
task:所要安排的任务
delay:执行任务前的延迟时间,单位是毫秒
period:执行一次task的时间间隔,单位是毫秒
作用
等到delay毫秒后首次执行task
之后每隔period毫秒重复执行一次task
代码演示:
定时调度的业务逻辑类:
package com.hcx.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;
/**
* Created by HCX on 2017/8/28.
* 需要定时调度的业务逻辑类
*/
public class MyTimerTask extends TimerTask{
private String name;
public MyTimerTask(String inputName) {
name = inputName;
}
@Override
public void run() {
/*
* 以yyyy-MM-dd HH:mm:ss的格式打印当前执行时间
* 如:2017-8-29 00:00:00
*/
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current exec time is(task) : " + sf.format(calendar.getTime()));
// 打印当前 name 的内容
System.out.println("Current exec name is(task) : " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
定时调度类:
package com.hcx.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
/**
* Created by HCX on 2017/8/28.
* 定时调度类
*/
public class MyTimer {
public static void main(String[] args){
//创建一个Timer实例(位于java.util包下的)
Timer timer = new Timer();
//创建一个MyTimerTask实例
MyTimerTask myTimerTask = new MyTimerTask("hcx");
/*
* 通过Timer定时定频率调用MyTimerTask的业务逻辑
* 即第一次执行是在当前时间的两秒钟之后,之后每隔一秒钟执行一次
*/
//timer.schedule(myTimerTask,2000L,1000L);
/**
* 获取当前时间,并设置成距离当前时间三秒之后的时间
* 如当前时间是2017-08-29 23:59:57
* 则设置后的时间则为2017-8-30 00:00:00
*/
Calendar calendar = Calendar.getInstance();
// 定义日期格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current exec time is : " + simpleDateFormat.format(calendar.getTime()));
//设置距离当前时间3秒之后的时间
calendar.add(Calendar.SECOND,3);
// schedule的四种用法
/**
* 1.在时间等于或超过time的时候执行仅且执行一次task
* 如在2017-08-30 00:00:00执行一次task,打印任务名字
*/
//myTimerTask.setName("schedule1");
//通过timer去schedule TimerTask,达成调度的功能
//timer.schedule(myTimerTask,calendar.getTime());
//执行结果:
/*
Current exec time is : 2017-08-29 15:41:22
Current exec time is(task) : 2017-08-29 15:41:25
Current exec name is(task) : schedule1
*/
/**
* 2.时间等于或超过time首次执行task
* 之后每隔period毫秒重复执行一次task
* 如在2017-08-29 00:00:00第一次执行task,打印任务名字
* 之后每隔两秒执行一次task
*/
//myTimerTask.setName("schedule2");
/*
每隔2秒都去执行一次task:
距离当前时间3秒钟之后首次执行task,之后的每隔两秒都会重复执行myTimerTask里面的run方法中的内容
*/
//timer.schedule(myTimerTask,calendar.getTime(),2000L);
/*
执行结果:
Current exec time is : 2017-08-29 15:51:16
Current exec time is(task) : 2017-08-29 15:51:19
Current exec name is(task) : schedule2
Current exec time is(task) : 2017-08-29 15:51:21
Current exec name is(task) : schedule2
...
*/
/**
* 3.等待delay毫秒后仅执行且执行一个task
* 如现在是2017-08-29 00:00:00
* 则在2017-08-29 00:00:01执行一次task,打印任务名字
*/
//myTimerTask.setName("schedule3");
//timer.schedule(myTimerTask,1000L);
/*
执行结果:
Current exec time is : 2017-08-29 16:01:29
Current exec time is(task) : 2017-08-29 16:01:30
Current exec name is(task) : schedule3
*/
/**
* 4.等到delay毫秒后首次执行task
* 之后每隔period毫秒重复执行一次task
* 如现在是2017-08-29 00:00:00
* 则在2017-08-29 00:00:01第一次执行task,打印任务名字
* 之后每隔两秒执行一次task
*/
//myTimerTask.setName("schedule4");
//timer.schedule(myTimerTask,1000L,2000L);
/*
执行结果:
Current exec time is : 2017-08-29 16:04:03
Current exec time is(task) : 2017-08-29 16:04:04
Current exec name is(task) : schedule4
Current exec time is(task) : 2017-08-29 16:04:06
Current exec name is(task) : schedule4
Current exec time is(task) : 2017-08-29 16:04:08
Current exec name is(task) : schedule4
...
*/
}
}
二、scheduleAtFixedRate的两种用法
1.scheduleAtFixedRate(task, time, period)
参数
task:所要安排的任务
time:首次执行任务的时间
period:执行一次task的时间间隔,单位是毫秒
作用
时间等于或超过time时首次执行task
之后每隔period毫秒重复执行一次task
2.scheduleAtFixedRate(task, delay, period)
参数
task:所要安排的任务
delay:执行任务前的延迟时间,单位是毫秒
period:执行一次task的时间间隔,单位是毫秒
作用
等到delay毫秒后首次执行task
之后每隔period毫秒重复执行一次task
代码演示:
调度的业务逻辑类与上面一致
定时调度类:
package com.hcx.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
/**
* Created by HCX on 2017/8/28.
* 定时调度类
*/
public class MyTimer {
public static void main(String[] args){
//创建一个Timer实例(位于java.util包下的)
Timer timer = new Timer();
//创建一个MyTimerTask实例
MyTimerTask myTimerTask = new MyTimerTask("hcx");
/*
* 通过Timer定时定频率调用MyTimerTask的业务逻辑
* 即第一次执行是在当前时间的两秒钟之后,之后每隔一秒钟执行一次
*/
//timer.schedule(myTimerTask,2000L,1000L);
/**
* 获取当前时间,并设置成距离当前时间三秒之后的时间
* 如当前时间是2017-08-29 23:59:57
* 则设置后的时间则为2017-8-30 00:00:00
*/
Calendar calendar = Calendar.getInstance();
// 定义日期格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current exec time is : " + simpleDateFormat.format(calendar.getTime()));
//设置距离当前时间3秒之后的时间
calendar.add(Calendar.SECOND,3);
// scheduleAtFixedRate的两种用法
/**
* 1.时间等于或超过time时首次执行task
* 之后每隔period毫秒重复执行一次task
* 如在2017-08-29 00:00:00第一次执行task,打印任务名字
* 之后每隔两秒执行一次task
*/
//myTimerTask.setName("scheduleAtFixedRate1");
//timer.scheduleAtFixedRate(myTimerTask,calendar.getTime(),2000L);
/*
执行结果:
Current exec time is : 2017-08-29 16:15:23
Current exec time is(task) : 2017-08-29 16:15:26
Current exec name is(task) : scheduleAtFixedRate1
Current exec time is(task) : 2017-08-29 16:15:28
Current exec name is(task) : scheduleAtFixedRate1
Current exec time is(task) : 2017-08-29 16:15:30
Current exec name is(task) : scheduleAtFixedRate1
...
*/
/**
* 2.等待delay毫秒后首次执行task
* 之后每隔period毫秒重复执行一次task
* 如现在是2017-08-29 00:00:00
* 则在2017-08-29 00:00:01第一次执行task,打印任务名字
* 之后每隔两秒执行一次task
*/
myTimerTask.setName("scheduleAtFixedRate2");
timer.scheduleAtFixedRate(myTimerTask,1000L,2000L);
/*
执行结果:
Current exec time is : 2017-08-29 16:18:39
Current exec time is(task) : 2017-08-29 16:18:40
Current exec name is(task) : scheduleAtFixedRate2
Current exec time is(task) : 2017-08-29 16:18:42
Current exec name is(task) : scheduleAtFixedRate2
Current exec time is(task) : 2017-08-29 16:18:44
...
*/
}
}
总结:timer通过schedule或者scheduleAtFixedRate函数,都能实现对task的一次或者多次的定时调度,我们只需要告诉它需要执行task的时间和频率,就能完成对task的定时定频率的调度