**********************************Timer的缺陷********************************
1、管理并发任务的缺陷
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符
2、当任务抛出异常时的缺陷
如果TimerTask抛出RuntimeException,Timer会停止所有任务的执行
********************************Timer的使用禁区**************************
1、对时效性要求较高的多任务并发作业
2、对复杂的任务的调度
------------------------------------------Timer--------------------------------------
1、Timer是jdk自带的
2、Timer的定义:有且仅有一个 后台线程 对多个 业务线程 进行 定时定频率的调度
3、主要构件:Timer(后台线程)和TimerTask(业务线程,继承)
4、实例步骤:
1、Timer timer = new Timer();
2、MyTimerTask my = new MyTimerTask();//自定义的类,继承自TimerTask,重写run方法
3、timer.schedule(my,2000L,1000L)//第一次执行是在当前时间的2秒之后,之后每隔1秒执行一次
my里面的run方法
--------------------------------------Timer的定时调度函数----------------------
1、schedule的四种用法
①schedule(task,time):
参数:
1、task-所要安排的任务
2、time-执行任务的时间
作用:在时间等于或超过time的时候执行且只执行 一次task
②schedule(task,delay):
参数:
1、task-所要安排的任务
2、delay-执行任务前的延迟时间,单位是毫秒
作用:等待delay毫秒之后,执行task,只执行一次task
③schedule(task,time,period):
参数:
1、task-所要安排的任务
2、time-首次执行任务的时间
3、period-执行一次task的时间间隔,单位是毫秒
作用:时间等于或超过time时,首次执行task,之后每隔period毫秒重复执行一次
④schedule(task,delay,period):
参数:
1、task-所要安排的任务
2、delay-执行任务前的延迟时间,单位是毫秒
3、period-执行一次task的时间间隔,单位是毫秒
作用:等待delay毫秒之后,首次执行task,之后每隔period毫秒重复执行一次
2、scheduleAtFixedRate的两种用法
①scheduleAtFixedRate(task,delay,period):
参数:
1、task-所要安排的任务
2、delay-执行任务前的延迟时间,单位是毫秒
3、period-执行一次task的时间间隔,单位是毫秒
作用:等待delay毫秒之后,首次执行task,之后每隔period毫秒重复执行一次
②scheduleAtFixedRate(task,time,period):
参数:
1、task-所要安排的任务
2、time-首次执行任务的时间
3、period-执行一次task的时间间隔,单位是毫秒
作用:时间等于或超过time时,首次执行task,之后每隔period毫秒重复执行一次
---------------------------------------Timer的其它重要函数------------------------------
***************************************TimerTask的重要函数*******************************
①cancle():
作用:取消当前Timertask里的任务
package com.imooc.thread.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;
public class MyTimerTask2 extends TimerTask{
private String name;
private Integer count = 0;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public MyTimerTask2(String name){
this.name = name;
}
@Override
public void run() {
if(count < 3){
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(sdf.format(c.getTime()));
System.out.println("current name is:" + name);
count ++;
}else{
this.cancel();//取消当前的任务
System.out.println("Timertask任务已经取消");
}
}
}
***********************************Time的函数r*********************************
1、Timer类的cancel()方法
作用:终止此计时器,丢弃所有当前已安排的任务
***********与TimerTask的cancel()方法的区别:TimerTask的cancel()方法只能取消TimerTask的单个任务,
而Timer的cancel()方法能取消所有任务
2、Timer类的purge()方法
作用:从此计时器的任务队列中移除所有已取消的任务
返回值:从队伍中移除的任务数
***************************Timer类的schedule方法和scheduleAtFixedRate方法的区别********************
(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay(延迟)了,随后的执行时间按 照 上一次 实际
执行完成的时间点 进行计算。
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始
的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步
***********************当执行任务的时间大于周期间隔时,会发生什么呢?*****************
(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
(2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性