1.程序和编程

我们知道,计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

简单来说程序在本质上是指令的集合,而编程从字面上来讲就是编写这些指令集合(程序),通过程序去完成某种行为。

在日常编程中,我们难免会遇到这种情况,如何在指定的时间去做某一件事情(比如闹钟响铃)?在Java中通常使用定时任务去实现,接下来会结合源码分析Java中的定时任务。

2.从段子开始

上面是一个关于时间和线程的段子。当然段子毕竟是为博众人一笑,我们开发中获取时间会有更好的方式。这里要说的是,如果我们要在下一天去做某个动作(比如上面说的闹钟响铃),

这种线程睡眠不失为一种简单的方法(虽然我们通常不建议使用这种方式,更倾向使用定时任务)。

3.Java定时任务

简单的说Timer中有两个核心部分:

TimerThread是时间线程,控制TaskQueue中TimerTask的执行;

TaskQueue是一个工具类,管理TimerTask数组

而Timer暴露的主要是一系列schedule方法,去建立Timer和TimerTask的联系。我们看到Java定时任务设计中很重要的部分就是定时器和任务的分离。

以上是简单的示例,在使用定时任务时要注意几点:

一个Timer可以执行多个TimerTask,但一个TimerTask只能被一个Timer使用(这和schedule中校验TimerTask的状态有关,TimerTask的生命周期(由不同的状态确定))。

通常不使用匿名类创建TimerTask抽象类的子类,建议创建单独的子类extend TimerTask。

根据实际需要采用不同的schedule方法或者scheduleAtFixedRate方法执行任务。

合理使用cancel和purge方法。

4.源码浅析

结合第3部分的简单示例,来梳理源码。

①创建Timer和TimerTask

Timer的核心构造方法,调用此方法时启动,初始化创建的TimerThread线程。

②执行schedule或scheduleAtFixedRate方法

其中核心的sched方法,主要是判断线程的状态,TimerTask的状态,然后将通过校验的TimerTask添加到TaskQueue,其后交由TimerThread管理。

③TimerThread原理

时间线程TimerThread中run方法执行的mianLoop方法如上,会一直循环执行。

a.获取TaskQueue中的第一个序列的TimerTask(通过getMin()方法获取),这里很重要,每次循环后TaskQueue序列可能会变化。

b.然后校验TimerTask的状态,移除TaskQueue不需要执行的TimerTask

c.对于能够执行的TimerTask,校验当前时间和执行时间, 通过taskFired标识(表示TimerTask是否就绪,可以执行),(然后处理只执行一次的,从TaskQueue中移除,按频率执行多次的重新排序,详见rescheduleMin方法)。

d.未就绪的TimerTask将wait,而就绪(状态正常且到执行时间的TimerTask)的执行TimerTask的run方法。此时该Timer中的TimerTask执行完毕,后续的就是TimerTask线程逻辑。

④TaskQueue和TimerTask

结合源码可以了解TaskQueue如何排序,以及TimerTask中不同的状态(生命周期)的意义。

4.总结

Java原生的定时任务包括Timer和TimerTask两部分,Timer为主,TimerTask为辅。

Timer中由TimerThread线程控制TimerTask是否执行,Java通过这两个类完成了定时任务的基本功能。

学习时不只是要学习其源码中内部实现,工作原理。更要关注Timer和TimerTask分离的思想,这很重要。

后续学习Java中其他的定时任务,如Spring的定时任务,Quartz。

java timertask 定时_Java定时任务--Timer和TimerTask相关推荐

  1. java 精确定时_Java定时任务Timer调度器【三】 注意事项(任务精确性与内存泄漏)...

    一.任务精确性 通过前两节的分析,大概知道了Timer的运行原理,下面说说使用Timer需要注意的一些事项.下面是Timer简单原理图 从上图可以看到,真正运行闹钟的是一个单线程.也就是说队列中的闹钟 ...

  2. java实现 定时_Java实现定时任务的几种方案重构

    聊聊定时任务 定时任务,顾名思义就是,定时去完成某项任务,例如指定某个时间点去做某件事情或者是指定一定的时间间隔去做某些事情.使用定时任务就是一种对生产力的解放,如果没有定时任务的话,对于以上的需求, ...

  3. java一定时间间隔的定时任务_Java 定时任务---Timer

    本文来自我一个朋友的个人博客(希望各位以后多多支持):https://www.liupeng.mobi/archives/777 一.Timer类 在java中一个完整的定时任务需要由Timer和Ti ...

  4. java wait定时_java定时器的使用(Timer)

    java定时器的使用(Timer) 1.在应用开发中,常常须要一些周期性的操作,比方每5分钟运行某一操作等. 对于这种操作最方便.高效的实现方式就是使用java.util.Timer工具类. priv ...

  5. java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务...

    经常我们都会有这样的需求,要固定的每隔一段时间执行某一个任务.比如: 我们做一个缓存来减少与数据库的交互,而为了使缓存与数据库中的数据尽量达到同步,需要每个固定的一段时间去数据库中的数据是否有更新以达 ...

  6. java 邮件 定时_java实现邮件定时发送

    需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能, ...

  7. java 如何定时_Java怎么实现定时提醒功能

    //可以启动一个线程来做时间计算//也可以用timer来实现定时 timer使用wait 我这里用sleep//关键不是用什么而是用线程来解决问题import java.util.Scanner;pu ...

  8. java 邮件 定时_Java定时发送邮件

    背景 甲方爸爸:新接入业务在国庆以及军运会期间需要每天巡检业务并发送邮件告知具体情况! 我司:没问题. 甲方爸爸:假期也要发噢. 我司:没问题(...). 刚开始计划指定几个同事轮流发送,业务只要不被 ...

  9. 任务调度之Timer、TimerTask

    老规矩,在进代码之前有必要先把什么是任务调度白话一下,所谓的任务调度指的就是在固定的时间节点开始,以固定或非固定的频率,执行某个动作或行为.        在咱们的日常生活中,任务调度随处可见:比如每 ...

最新文章

  1. 再见,Python!你好,Go语言
  2. soapUI学习笔记--用例字段参数化
  3. 根据ip地址获得天气预报
  4. gcc -o sqlite3 shell.c sqlite3.c -ldl -lpthread
  5. iOS camera 相关
  6. HDU 5643 约瑟夫环的应用
  7. android支付宝免密支付功能,手机支付宝如何将免密支付功能关闭掉
  8. python实现onvif客户端及问题小结
  9. lenovo启动热键_联想电脑如何进入U盘启动,按哪个快捷键?
  10. android 恢复出厂设置 时间,安卓恢复出厂设置
  11. TeamViewer 如何注册账户?
  12. Windows Server 2016 实现跨域、跨林之间的访问
  13. 计算机输入法不能切换用户登录,Win7输入法无法切换怎么办?
  14. 笔记——Tensorflow: The Confusing Parts (2)
  15. 软件测试应遵循哪些原则?
  16. 个人关于颈椎病治疗和保养的一些经验总结!
  17. TunesKit Audio Converter for Mac(音频格式转换软件)
  18. Java大用处——动态数组的实现
  19. 2016--Analysis of the DNN-based SRE systems in multi-language conditions
  20. 普通大学,多年功能测试,3年进入小米,软件测试如何有效的学习?

热门文章

  1. webpackjsonp 还原_钌金属单原子电催化实现常温常压高效还原固氮
  2. VI编辑器_终端编辑器(命令整理)
  3. 利用新型蓝牙攻击,开走特斯拉 Model 3 和 Model Y
  4. 平板触控笔哪款好用?电容笔牌子排行
  5. 8.Spring security中的HttpFirewall
  6. 企业网盘的映射盘、同步盘、虚拟盘 都是些什么?
  7. ubuntu16下 D415 驱动配置与硬件更新
  8. 2022 ACM Fellow名单出炉,腾讯AI Lab俞栋成功入选
  9. 《Python繁琐工作自动化》 ,附中文 PDF 下载
  10. Lucene倒排索引