Timer由JDK提供,可以实现简单的任务调度场景。Timer只有一个后台线程,所以在使用在注意其场合。定时器是异步执行,不影响定时器后面代码的运行!
虽然一个Timer可以运行多个定时任务,但是一个Timer是串行运行
Timer的使用禁区:1、对时效性要求比较较高的多任务并发作业 2、对复杂任务的调度
Timer的缺陷:1、管理并发的缺陷以及任务之间的协同缺陷(因为后台只有一个线程) 2、当任务抛出异常时的缺陷(所有task终止)同时也不支持例如每周三运行任务这样的模式
这里还介绍了Timer和TimerTask的几个常用方法
TimerTask的cancel、scheduledExecutionTime方法。
Timer的schedule、scheduleAtFixedRate、cancel、purge方法
Timer中schedule和scheduleAtFixedRate的区别:(具体用法见下面的demo)
- 首次计划执行时间早于当前的时间
- 任务执行所需时间超出任务的执行周期间隔
下面是Timer的使用:
Timer需要搭配TimerTask使用
TimerTask:
package timer;
import java.util.TimerTask;
/**
* @Author Rhine
* @Date 2019/1/21 0:44
**/
public class MyTimerTask extends TimerTask {
private String name;
public MyTimerTask(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
//打印当前name的内容
System.out.println("Current exce name is: "+name);
}
}
Timer:
package timer;
import java.util.Timer;
/**
* @Author Rhine
* @Date 2019/1/21 0:46
**/
public class MyTimer {
public static void main(String[] args) {
//1.创建一个timer实例
Timer timer=new Timer();
//2.创建一个MyTimerTask实例
MyTimerTask myTimerTask=new MyTimerTask("No.1");
//3.通过timer定时定频率调用myTimerTask的业务逻辑
// 即第一次执行实在当前时间的两秒之后,之后每隔一秒钟执行一次
timer.schedule(myTimerTask,2000L,1000L);
}
}
Timer有schedule和scheduleAtFixedRate两种方法
其中schedule的有四种用法,scheduleAtFixedRate有两种用法
package timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
/**
* @Author Rhine
* @Date 2019/1/21 0:46
**/
public class MyTimer {
public static void main(String[] args) {
//1.创建一个timer实例
Timer timer=new Timer();
//2.创建一个MyTimerTask实例
MyTimerTask myTimerTask=new MyTimerTask("No.1");
//3.通过timer定时定频率调用myTimerTask的业务逻辑
// 即第一次执行实在当前时间的两秒之后,之后每隔一秒钟执行一次
// timer.schedule(myTimerTask,2000L,1000L);
/**
* 获取当前时间,并设置成距离当前时间三秒之后的时间
* 如当前是2016-11-10 23:59:57
* 则设置后的时间则为2016-11-11 00:00:00
*/
Calendar calendar=Calendar.getInstance();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(calendar.getTime()));
calendar.add(Calendar.SECOND,3);
//------------------------ schedule的四种用法 -------------------------------
/**
* schedule(task,time)
* 1.在时间等于或超过time的时候执行且仅执行一次task
* 如在2016-11-11 00:00:00执行一次task:打印任务的名字
*/
// myTimerTask.setName("schedule1");
// timer.schedule(myTimerTask,calendar.getTime());
/**
* schedule(task,time,period)
* 2.时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
* 如在2016-11-11 00:00:00执行一次task:打印任务的名字,之后每隔两秒执行一次task
*/
// myTimerTask.setName("schedule2");
// timer.schedule(myTimerTask,calendar.getTime(),2000);
/**
* schedule(task,delay)
* 3.等待delay毫秒后执行且仅执行一次task
* 如在2016-11-11 00:00:01执行一次task:打印任务的名字
*/
// myTimerTask.setName("schedule3");
// timer.schedule(myTimerTask,1000);
/**
* schedule(task,delay,period)
* 4.等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
*/
// myTimerTas