定时任务调度:基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务。这里主要介绍两种任务调度方式:
1.timer:由JDK提供,不需要其他jar包
2.quartz:比timer更强大,完善
1.timer任务Demo
任务类MyTimerTask.java
执行任务调度类MyTimer.java
运行任务调度类,控制台每隔1s打印出一条数据。
2.讲解Timmer中的方法
2.1schedule(task,time)
在时间等于或超过time的时候执行且仅执行一次task
*task:所要安排的任务
*time:执行任务的时间
MyTimerTask.java
MyTimer.java
2.2 schedule(task,time,period)
时间等于或超过time时首次执行的task,之后每隔period毫秒重复执行一次task
task:所要安排的任务
time:首次执行任务的时间
period:执行一次task的时间间隔,单位是毫秒
MyTimer.java
2.3 schedule(task,delay)
等待delay毫秒后执行且仅执行一次task
task:所要安排的任务
delay:执行任务前的延迟时间,单位是毫秒
2.4 schedule(task,delay,period)
等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
task:所要安排的任务
delay:执行任务前的延迟时间,单位是毫秒
period:执行一次task的时间间隔,单位是毫秒
2.5 scheduleAtFixedRate的两种用法
scheduleAtFixedRate(task,time,period):时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task
task:所要安排的任务
time:首次执行任务的时间
period:执行一次task的时间间隔,单位是毫秒
scheduleAtFixedRate(task,delay,period):等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task
task:所要安排的任务
delay:执行任务前的延迟时间,单位是毫秒
period:执行一次task的时间间隔,单位是毫秒
2.7 timerTask下的函数
cancel():取消当前TimerTask里的任务
在MyTimerTask.java类里添加计时器,当执行完3次以后取消任务
scheduledExecutionTime():返回此任务最近实际执行的已安排执行的时间,long型
2.8 timer下的函数
cancel():终止此计时器,丢弃所有当前已安排的任务。
purge():从此计时器的任务队列中移除所有已取消的任务。返回从队列中移除的任务数
2.9 schedule与scheduleAtFixedRate的区别
·首次计划执行时间早于当前时间
schedule方法
“fixed-delay”,如果第一次执行时间被dalayl了,随后的执行时间按照上一次实际执行完成的时间点进行计算
scheduleAtFixedRate方法
“fixed-rate”,如果第一次执行时间被delay了,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步
·任务执行时间超出执行周期间隔
schedule方法
下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后
scheduleAtFixedRate方法
下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性
2.10模拟两个机器人的定时行为
第一个机器人会隔两秒打印最近一次计划的时间、执行内容
第二个机器人会模拟往桶里倒水,直到桶里的水满为止
第一个机器人
第二个机器人
执行类
3.Timer的缺陷
管理并发任务的缺陷:Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符
当任务抛出异常时的缺陷:如果timerTask抛出RuntimeException,Timer会停止所有任务的运行
·管理并发任务的缺陷
MyTimerTask2.java
MyTimer2.java创建两个任务并发执行
运行程序,查看控制台输出结果得知,两个任务并不是并发执行的。
4.Timer的使用禁区
·对时效性要求较高的多任务并发作业
·对复杂的任务的调度
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!