java的定时任务调度:
1、timer —-jdk自带的。
2、quartz—-第三方jar包 传送门
这里分享一下第一种Timer的使用,具体实际中,能用Timer的就别用quartz。
Timer:java.util.Timer
有且仅有一个后台线程对多个业务流程进行定时定频率的调度。
原理:Timer 定时调用 TimerTask
一、Timer的调度器
Timer的两个调度器—-schedule和scheduleAtFixedRate
schedule()
schedule(task,time)
在时间等于或超过time的时候执行,且只执行一次。schedule(task,time,period)
时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。schedule(task,delay)
等待delay毫秒后执行一次taskschedule(task,delay,period)
等待delay毫秒后执行task,以后每隔period毫秒重复执行一次task
scheduleAtFixedRate()
scheduleAtFixedRate(task,time,period)
时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task。scheduleAtFixedRate(task,delay,period)
等待delay毫秒后执行task,以后每隔period毫秒重复执行一次task
二、Timer和TimerTask的其它函数
TimerTask的其它函数
cancel()
取消TimerTask的执行scheduledExecutionTime()
返回此任务最近实际执行的已安排执行的时间,为long型
Timer的其它函数
cancel()
终止此计时器,丢弃所有当前已安排的任务purge()
从此计时器的任务队列中移除所有已取消的任务。返回值:从队列中移除的任务数。
三、Timer两个调度器之间的区别
schedule() scheduleAtFixedRate()区别
1、首次计划执行时间早于当前时间
前者:如果第一次执行时间在计划时间之前,随后的执行时间按照上一次实际执行完成的时间点进行计算。
后者:如果第一次执行时间在计划时间之前,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步。
2、任务执行时间超出执行周期间隔
前者:下次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后。
后者:下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性。
四、Timer的使用限制
Timer的两种缺陷:
并发任务的缺陷:
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符。当任务抛出异常时的缺陷:
如果TimerTask抛出RunTimeException,Timer会停止所有任务的执行。
使用禁区:
* 对时效性要求较高的多任务并发作业
* 对复杂的任务的调度
五、简单的实例
1、MyTimerTask 类
import java.util.TimerTask;
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class MyTimerTask extends TimerTask{
private String taskName;
public MyTimerTask(String name){
taskName = name;
}
public void run(){
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
System.out.println("current exec time :"+sf.format(calendar.getTime()));
System.out.println("current exec name :"+taskName);
}
public void SetName(String name){
taskName = name;
}
public String GetName(){
return taskName;
}
}
2、MyTimer类
import java.util.Timer;
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class MyTimer{
public static void main(String[] args) {
Timer myTimer = new Timer();
MyTimerTask myTimeTask = new MyTimerTask("task1");
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
System.out.println("current time :"+sf.format(calendar.getTime()));
calendar.add(Calendar.SECOND,3);
myTimeTask.SetName("schedule1");
myTimer.schedule(myTimeTask,calendar.getTime(),2000L);
// myTimeTask.SetName("schedule2");
// myTimer.schedule(myTimeTask,2000L,1000L);
}
}