`

Timer简介与不足

 
阅读更多

 

jdk自带定时器的使用包括两个类Timer、TimerTask,还有两个类是不需要使用者操心的TaskQueue和TimerThread。

 

类介绍与定时器原理

TimerTask抽象类是用于定义定时执行的任务,它实现Runnable接口。使用者只要继承这个类,并将定时任务的业务逻辑写在run()方法里就行。但是不要误会,不是为每一个任务新建一个线程。这个抽象类还维护着任务的执行周期long period、下次执行时间long nextExecutionTime以及task的执行状态

TaskQueue内部维护着一个TimerTask的数组,用于保存一个Timer要执行的任务队列,这个类最重要的方法fixUp(),它的作用就是根据任务的下次执行时间排列任务在数组中的位置

TimerThread类继承Thread,它的run()方法主要作用就是调用mainLoop()方法,mainLoop方法做的事就是从自身的TaskQueue中取下次执行时间最近的任务,调用它的run()方法,如果该任务下次执行时间还没到差多久就wait()多久。如此循环直到任务队列为空且标识对象newTaskMayBeScheduled为false(该标识可由Timer的cancel()方法改变)跳出循环

Timer内部维护一个TaskQueue私有final属性queue,一个TimerThread私有final属性thread,queue=new TaskQueue(),thread=new TimerThread(queue)。而我们调用的Timer.schedule方法做的事就是根据参数为task设置period和nextExecutionTime以及状态,再将它放到queue中,如果原本queue中没有任务thread线程处于wait状态这时候还需要notify一下

 

可以看到一个Timer是一个线程,线程中所有任务是串行执行的,也就是说一个任务执行时间太长是有可能影响到下一个任务的执行的

 

Timer定时器的不足

1.任务调度灵活性不足

假设这样一个场景,一个公司每个月10号给员工发工资,如果碰到非工作日移到最靠近的一天。这个任务Timer是完成不了的,timer能做的只有从一个时间点开始每隔一定时间调用任务,而生成环境中很多时候业务需求并不会这么简单。

2.缺乏定时器管理方案

Timer缺少一个管理方案将所有定时器统一管理,比如要在代码中任意位置获得具体某个定时器,我们可以用一个静态常量对象将每个定时器命名并存储起来,需要查看或操作某个定时器的时候就能随时获得,Timer缺少这样的机制

 

 

分享到:
评论

相关推荐

    应用笔记LAT1189+Timer结合DMA+2D通道实现不同波形输出

    通过上述方法,不仅可以有效地解决因DAC资源不足而无法直接输出正弦波的问题,还可以利用STM32U5系列的GPDMA特性,轻松实现正弦波与固定电平的自动切换,大大提高了系统的灵活性和实用性。此外,STM32CubeMX软件提供...

    JAVA定时运行程序

    #### 二、`java.util.Timer`类简介 `java.util.Timer`是Java标准库中用于调度执行线程的类。它可以安排任务在将来某个时间点或者按照固定的时间间隔重复执行。这使得开发人员能够轻松地为应用程序添加定时功能,...

    javaSE代码实例

    17.3.3 ReadWriteLock接口与ReentrantReadWriteLock类简介 390 17.3.4 ReentrantReadWriteLock读/写锁的具体使用 391 17.4 信号量的使用 393 17.4.1 Semaphore类简介 393 17.4.2 Semaphore类的具体使用 ...

    2009最流行VB流星代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这是一段Visual Basic(简称VB)编程语言编写的流星效果程序。...虽然代码本身可能存在着一些不足之处,但它为初学者提供了一个很好的学习示例。

    精彩编程与编程技巧-在VB6.0中播放GIF动画...

    综上所述,通过使用WebBrowser控件,可以在VB6.0环境中轻松地实现GIF动画的播放,解决了原生支持不足的问题,并且能够通过简单的代码实现动态效果。这对于需要在VB应用程序中加入动画元素的开发者来说是非常实用的...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    14.1.3 Ajax的优势与不足 14.2 ASP.NET AJAX 14.2.1 ASENET AJAX的特性 14.2.2 ASENET AJAX的安装 14.3 ASENET AJAX控件 14.3.1 ScriptManager控件 14.3.2 ScriptManagerProxy控件 14.3.3 UpdatePanel控件 ...

    奇怪的Windows 8 Metro应用.docx

    - **互动性探讨**:该应用通过简单的游戏机制,增加了用户与猫咪之间的互动性,同时也可以作为一种了解不同品种猫咪的方式。 - **教育价值**:除了娱乐效果之外,《The Cat App》还具有一定的教育意义,可以帮助...

    VB做的简易贪吃蛇1

    1. **Visual Basic 简介**:VB是微软公司开发的一种可视化的、面向对象的编程语言,它简化了编程过程,让开发者可以通过拖拽控件和编写事件代码来创建应用程序。VB6是其经典版本,而VB.NET则是.NET框架下的现代版本...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    5.3.1 rsync的优点与不足 5.3.2 初识inotify 5.3.3 安装inotify工具inotify-tools 5.3.4 inotify相关参数 5.3.5 inotifywait相关参数 5.3.6 企业应用案例:利用rsync+inotify搭建实时同步系统 5.4 ...

    bootloader测试说明

    #### 一、Bootloader简介及功能 Bootloader是一种嵌入式系统的引导加载程序,主要用于初始化硬件设备、建立内存空间映射图,从而为最终调用操作系统内核做好准备。本篇文章主要围绕一本描述bootloader启动代码分析...

    商业编程-源码-VC.NET简单实现GIF动画.zip

    3. VC#.NET简介:VC#.NET是微软的集成开发环境(IDE),用于编写使用C#语言的Windows应用程序。它提供了丰富的工具和功能,如自动完成、调试器和图形用户界面(GUI)设计工具,使得开发过程更加高效。 4. 图像处理...

    STM32单片机FPGA毕设电路原理论文报告单片机应用系统中的看门狗电路及低成本实现

    它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 - **灵活性**: FPGA可以在设计阶段甚至在产品进入市场后进行重新配置。 - **...

    20071010am--.NET Windows编程系列课程(15):多线程编程.pdf

    #### 一、课程简介 本课程由邵志东讲师提供,旨在帮助学员深入了解.NET框架下的多线程编程技术。课程内容涵盖线程的基本概念、.NET环境下的多线程编程实践、线程池的应用、异步编程技巧以及多线程的实际应用案例。...

    Huawei LiteOS 开发指南.pdf

    #### 一、华为LiteOS系统简介 华为LiteOS是一款轻量级的物联网(IoT)操作系统,旨在为物联网设备提供高效、安全的操作环境。它具备低功耗、快速启动、高可靠性的特点,适用于各种资源受限的嵌入式设备。LiteOS不仅...

    java代码-Java连连看游戏

    - 开发者通常会添加错误处理代码来确保程序在遇到意外情况时能够优雅地处理,如用户非法操作或资源不足等。 7. **文件读写与配置**: - 游戏可能会保存用户的进度或者设置,这就需要文件读写操作。Java的File、...

    ASP.NET4高级程序设计(第4版) 3/3

    9.3.7 SqlDataSource的不足 290 9.4 ObjectDataSource 291 9.4.1 选择记录 291 9.4.2 更新记录 295 9.4.3 使用数据对象执行更新 296 9.5 数据源控件的限制 299 9.5.1 问题 299 9.5.2 添加其他项 300...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    9.3.7 SqlDataSource的不足 9.4 ObjectDataSource 9.4.1 选择记录 9.4.2 更新记录 9.4.3 使用数据对象执行更新 9.5 数据源控件的限制 9.5.1 问题 9.5.2 添加其他项 9.5.3 使用SqlDataSource处理...

Global site tag (gtag.js) - Google Analytics