时间任务调度,我们一定不会陌生,那么今天就来看看JDK中的时间任务调度工具Timer;
什么是定时任务调度:
基于给定的时间点,给定的时间间隔或者给定的执行次数 自动执行的任务;
Timer简介: 有且仅有 一个后台线程 对 多个业务线程 进行 定时定频率的调度;
关于Timer的测试代码:
1, 首先创建任务 MyTimerTask 继承 TimerTask 重写 run():
package timer;
import java.text.SimpleDateFormat;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask{
private String name;
private int count = 0;
public MyTimerTask() {}
public MyTimerTask(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//测试 schedule() 与 scheduleAtFixedRate() 区别:
Thread.sleep(3000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(count<5){
System.out.println("当前Task名称:" + name + ", 执行时间:" + sf.format(scheduledExecutionTime()));
count++;
} else {
//结束当前任务
cancel();
System.out.println("TimerTask "+name+" is cancel(), count="+count+", 最后执行时间:"+ sf.format(scheduledExecutionTime()));
}
}
}
2, Timer 调用测试:
package timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
public class MyTimer {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
MyTimerTask myTimerTask = new MyTimerTask("NO.1.1");
Calendar calender = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间: " + sf.format(calender.getTime()));
// ------------schedule的四种用法----------
/**
* 1, schedule(Task,Date time);在时间等于或着超过time的时候执行且执行一次task;
*/
//calender.add(Calendar.SECOND, 3);
// timer.schedule(myTimerTask, calender.getTime());
/**
* 2, schedule(task, Date firstTime, long period); 参数说明: task: 执行任务,
* firstTime: 首次执行时间, period: 执行时间间隔(毫秒) 作用:
* 时间等于或超过time时首次执行task,之后每隔period毫秒执行一次task;
*/
// myTimerTask.setName("NO.1.2");
// timer.schedule(myTimerTask, calender.getTime(), 2000L);
/**
* 3, schedule(TimerTask task, long delay); 作用: 等待 delay 毫秒后 执行且执行一次
* task
*/
// myTimerTask.setName("NO.1.3");
// timer.schedule(myTimerTask, 1000L);
/**
* 4, schedule(TimerTask task, long delay, long period) 作用: 等待 delay毫秒后
* 执行第一次 task,之后没隔 period毫秒执行一次;
*/
// myTimerTask.setName("NO.1.4");
// timer.schedule(myTimerTask, 2000L, 1000L);
// ---------------scheduleAtFixedRate的两种用法---------------
/**
* 5, scheduleAtFixedRate(TimerTask task, long delay, long period); 作用:
* 与4相同;
*/
// myTimerTask.setName("NO.1.5");
// timer.scheduleAtFixedRate(myTimerTask, 2000L, 1000L);
/**
* 6, scheduleAtFixedRate(TimerTask task, Date firstTime, long period);
* 作用: 与2相同;
*/
// myTimerTask.setName("NO.1.6");
// timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 2000L);
// ---------------------------其他函数用法------------------------------------
/**
* 7, cancel(); 作用: 终止此计时器,丢弃所有当前已安排的任务;
*/
// MyTimerTask myTimerTask2 = new MyTimerTask("NO.2.1");
// timer.scheduleAtFixedRate(myTimerTask2, calender.getTime(), 2000L);
// Thread.sleep(5000L);
// timer.cancel();
// System.out.println("timer is cancel()");
/**
* 8, purge(); 作用: 从此计时器的任务队列中移除所有已取消的任务,并返回从队列中移除的任务数;
*/
// myTimerTask2.cancel();
// int number = timer.purge();
// System.out.println("timer is purge() number=" + number);
// ---------schedule 和 scheduleAtFixedRate的区别:-------------
/* 1, 首次计划执行的时间早于当前的时间时; */
//设置开始执行时间为当前时间六秒前
// calender.add(Calendar.SECOND, -6);
/**
* 9, schedule();
* "fixed-delay", 如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行的时间点进行计算;
*/
// timer.schedule(myTimerTask, calender.getTime(), 1000L);
/**
* 10, scheduleAtFixedRate();
* "fixed-rate",如果第一次执行时间被delay了,随后执行时间按照上一次开始时间点进行计算,
* 并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步;
*/
// timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L);
/* 2, 任务执行所需时间超出任务的执行周期间隔时; */
/**
* 11, schedule();
* 下次执行时间相对上次实际执行完成的时间点,因此执行时间会不断延后
* */
// timer.schedule(myTimerTask, calender.getTime(), 1000L);
/**
* 12, scheduleAtFixedRate();
* 下次执行时间相对上次实际执行开始的时间点,因此执行时间不会延后,存在并发性;
* */
timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L);
//------------------Timer的缺陷及使用禁区----------------------
/**
* 天生的两种缺陷:
* 1, 管理并发任务的缺陷;
* Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符;
*
* 2, 当任务抛出异常时的缺陷;
* 如果TimerTask抛出RuntimeException, Timer会停止所有的任务运行;
*
* 使用禁区:
* 1, 对时效性要求较高的多任务并发作业;
*
* 2, 对复杂任务的调度;
* */
}
}