# JAVA定时任务Timer **Repository Path**: Yenn-2017_admin/java_timing_task_timer ## Basic Information - **Project Name**: JAVA定时任务Timer - **Description**: 练习 JDK自带的定时任务用法。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-10-31 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JAVA定时任务Timer #### 项目介绍 看视频学习[Java定时任务调度工具详解之Timer篇](https://www.imooc.com/learn/841) 练习JDK自带的定时任务用法。 ### 1-1课程介绍 1. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务 2. 在JAVA中的定时调度工具 Timer Quartz 3. Timer和Quartz的区别 出生不同 JDK自带 添加Maven依赖包 能力不同 简单的定时任务 更强大 底层机制 单个 支持线程池 ### 2-1 timer简介 1. Timer纸上谈兵 2. Timer实战演练 3. Timer定义:[jdk文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh) 一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 A facility for threads to schedule tasks for future execution in a background thread. Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals. Timer TimerThread TaskQueue TimerTask 4. 实例 MyTimerTask.java MyTimer.java ### 3-1 timer定时函数的用法 1. 本节内容 schedule的四种用法 scheduleAtFixedRate的两种用法 2. schedule的四种用法 3. schedule(task,time) task-所要安排的任务 time-首次执行任务的执行时间 作用:在时间等于或超过time的时间执行且仅执行一次task 4. schedule(task, time, period) task-所要安排的任务 time-首次执行任务的执行时间 period-执行一次task的时间间隔,单位ms 作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task 5. schedule(task, delay) task-所要安排的任务 delay-执行任务前的延迟时间,单位是ms 作用:在等待delay毫秒后执行且仅执行一次task 6. schedule(task, delay, period) task-所要安排的任务 delay-执行任务前的延迟时间,单位是ms period-执行一次task的时间间隔,单位ms 作用:在等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task 7. scheduleAtFixedRate的两种方法 8. scheduleAtFixedRate(task, time, period) task-所要安排的任务 time-首次执行任务的执行时间 period-执行一次task的时间间隔,单位ms 作用:时间等于或超过time时首次执行task,之后每隔period毫秒重复执行一次task 9. scheduleAtFixedRate(task, delay, period) task-所要安排的任务 delay-执行任务前的延迟时间,单位是ms period-执行一次task的时间间隔,单位ms 作用:在等待delay毫秒后首次执行task,之后每隔period毫秒重复执行一次task ### 3-2 其他重要函数 1. TimerTask的cancel(), scheduledExecutionTime() 2. Timer的cancel(), purge() 3. TimerTask的cancel() 作用: 取消当前TimerTask里的任务 4. TimerTask的scheduledExecutionTime() 作用: 返回此任务最近时间执行的已安排执行的时间 返回值: 最近发生此任务执行安排的时间,为long型 5. Timer的cancel() 作用: 终止此计时器,丢弃所有当前已安排的任务 6. Timer的purge() 作用: 从此计时器的任务队列中移除所有已取消的任务 返回值: 从队列中移除的任务数 ### 3-3 schedule与scheduleAtFixedRate的区别 1. 两种情况看区别 首次计划执行的时间早于当前的时间 任务执行所需的时间超出任务的执行周期间隔 | 分类 | schedule方法 | scheduleAtFixedRate方法 | | -------- | -----: | :----: | | 首次计划执行的时间早于当前的时间 | "fixed-delay":如果第一次执行时间被delay了,随后的执行时间按照`上一次时间执行完成的时间点`进行计算 | "fixed-rate":如果第一次执行时间被delay了,随后的执行时间按照`上一次开始的时间点`进行计算,并且为了`赶上进度`会多次执行任务,因此TimerTask中的执行体需要`考虑同步 ` | | 任务执行所需的时间超出任务的执行周期间隔 | 下一次执行时间相对于`上一次实际执行完成的时间点`,因此执行时间会`不断延后` | 下一次执行时间相对于`上一次开始的时间点`, 因此执行时间一般`不会延后`,因此存在`并发性` | ### 3-4 Timer函数的综合应用 1. 主要内容 通过模拟两个机器人的定时行为来把我们签名所学的主要函数给结合起来,让大家加深对这些函数的理解 2. 实现俩个机器人 第一个机器人:会每隔两秒打印最近一次计划的时间、执行内容 第二个机器人:会模拟往桶里倒水,直到桶里的水满为止 3. 第二个机器人:灌水机器人的执行流程 ```flow st=>start: 灌水机器人 op=>operation: 灌水一次(每隔1S) cond=>condition: 水是否满, 是或否? e=>end: 停止工作 st->op->cond cond(yes)->e cond(no)->op ``` 4. 第一个机器人:跳舞机器人的执行流程 ```flow st=>start: 跳舞机器人 op=>operation: 跳舞一次2S(每隔2S) cond=>condition: 水是否满, 是或否? op2=>operation: 跳舞一次2S e=>end: 停止工作 st->op->cond cond(yes)->op2->e cond(no)->op ``` ### 4-1 Timer的缺陷 1. 天生的两种缺陷 管理并发任务的缺陷 当任务抛出异常时的缺陷 2. 管理并发任务的缺陷 Timer有且仅有一个线程去执行任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符 3. 当任务抛出异常时的缺陷 如果TimerTask抛出RuntimeException, Timer会停止所有任务的运行 4. Timer的使用禁区 对时效性要求较高的多任务并发作业 对复杂任务的调度