java定时器_拾遗Timer定时器

cc0471ffe17830b20077ef4db0513e72.png

一 Timer 介绍

在开发中我们经常会遇到一些简单定时任务的需求,而不需要量级较重的定时任务就可以采取java定时器;

java.util.Timer工具类中的Timer 是定时器,但定时任务写在java.util.TimerTask 中,由 Timer 执行 TimerTask ;

Timer 的本质就是线程,构造方法如下

public 

从源码角度可知,如果这样创建定时器非守护线程,即使主线程运行结束,定时任务还是会执行;如果我们会使用如下的构造方式创建定时任务就是守护线程方式,会随着主线程的消亡而消亡;

public 

Timer内部维护了一个优先队列,用于顺序执行TimerTask任务;

private 

优先队列的实现就是数组方式作为平衡二叉堆

private 

TimerTask 实现了Runnable 接口,执行的任务动作就是run方法;

public 

所以定时器的本质就是启动了一个新的线程执行任务,这些任务都会维护在优先队列里面

timer的调度主要方法如下

  • schedule(TimerTask task, long delay) 延迟 delay 毫秒执行一次
  • schedule(TimerTask task, Date time) 指定时间执行一次
  • schedule(TimerTask task, long delay, long period) 延迟delay毫秒以后,每隔period毫秒执行一次
  • schedule(TimerTask task, Date firstTime, long period) 从firstTime时刻开始,每隔period毫秒执行一次

二 Timer使用示例

如果方式简单使用Timer去延迟执行线程任务,当然其它四种方法同理,调用方式区别不大;

public 

输出的间隔大约就是5秒

程序执行时间 18:47:28.258
线程执行了18:47:33.259

三 cancel 方法

TimerTask的cancel () 方法是将自身任务从任务队列中移除

我们先延迟2秒,再每2秒执行一次看效果

public 

结果是每2秒会执行一次

程序执行时间18:59:23.557
线程执行了18:59:25.558
线程执行了18:59:27.558
线程执行了18:59:29.559

启用cancel方法,后 就只会执行一次

public 

输出如下

程序执行时间19:02:12.770
线程执行了19:02:14.772

Timer的cancel方法是移除所有的任务;

public 

输出直接报错

程序执行时间:19:34.294
Exception in thread "main" java.lang.IllegalStateException: Timer already cancelled.at java.util.Timer.sched(Timer.java:397)at java.util.Timer.schedule(Timer.java:248)at com.youku1327.base.timer.TimerAbsolute.main(TimerAbsolute.java:28)

四 scheduleAtFixedRate

schedule 与 scheduleAtFixedRate 方法的区别如下:

schedule 方法如果执行任务的时间没有被延迟,下一次执行任务时间参考的是上一次任务执行的开始时间

scheduleAtFixedRate 方法如果执行任务的时间没有被延迟,下一次执行任务时间参考的是上一次任务执行的结束时间

五 Timer缺点

  • Timer 对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。
  • Timer 线程是不会捕获异常的,如果 TimerTask 抛出的了未检查异常则会导致 Timer 线程终止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逻辑门电路的知识点归纳

1.半导体二极管与MOS管的开关特性 二极管:正向导通,反向截止,但是要注意的是从反向截止到正向导通的时间极其短,但是从正向导通到反向截止要经过反向恢复(电荷存储效应)的过程,这个过程实际上就…

善心

2019独角兽企业重金招聘Python工程师标准>>> 一个穷苦学生郝武德.凯礼,为了付学费,挨家挨户地推销货品。 到了晚上,发现自己的肚子很饿,而口袋里只剩下一个小钱。他在大街上犹豫徘徊了半天,终于鼓起勇气&a…

python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路

一、Python 已来 AI 不远在当今,人工智能已经渗透到了智能手机、网络搜索,广告分发,人脸识别,语音识别,自动驾驶,智能医疗,无人银行等日常生活领域。人工智能的生活化是不可避免的,它…

js判断用户是否离开当前页面

简介 VisibilityChange 事件;用于判断用户是否离开当前页面 Code // 页面的 visibility 属性可能返回三种状态 // prerender,visible 和 hidden let pageVisibility document.visibilityState; // 监听 visibility change 事件 document.addEventLi…

记一次B站答题经历

第一题部分:社区规范卷 --------- ------------ 第二题:社区规范第二部分 -------------------- 第三部分自由选择题 ---------------------- -------------------------------- 最后答题成绩得分 -------------- ------------- 答完题后的感受&#xff…

linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...

Linux在安装软件的时候有时会出现错误,提示缺少动态链接库.so,该问题是由什么原因导致的呢?情况分析:1.缺少动态连接库.so-cannot open shared object file:No such file or directory2.缺少动态连接库.so.0-cannot open shared object file…

yaf(5) smarty

2013年4月6日 13:41:37 参考: http://www.oschina.net/question/812776_71817 http://yaf.laruence.com/manual/yaf.class.dispatcher.setView.html 这两者都是在bootstrap.php中写_initSmarty()函数来重新实现yaf的视图接口 这中方案默认的是存放模版文件的上级文件夹名字必须…

Hibernate(三) - hibernate 表操作-多对多配置

Hibernate 的一对多关联映射 之前在学习 Hibernate 的时候,其实都是单表的操作。在实际的开发当中,比如做一个商城,就需要好多张数据库表,表与表之间是有关系的。之前些做一些关联查询或者是一些基本的查询操作的时候,…

vb treeview 展开子节点_详解最长公共子序列问题,秒杀三道动态规划题目

学算法认准 labuladong后台回复进群一起力扣?读完本文,可以去力扣解决如下题目:1143.最长公共子序列(Medium)583. 两个字符串的删除操作(Medium)712.两个字符串的最小ASCII删除和(Medium)好久没写动态规划算法相关的文章了,今天来搞一把。不…

linux查看数据积压,查看kafka消息队列的积压情况

创建topickafka-topics --create --zookeeper master:2181/kafka2 --replication-factor 2 --partitions 3 --topic mydemo5列出topickafka-topics --list --zookeeper master:2181/kafka2描述topickafka-topics --describe --zookeeper master:2181/kafka2 --topic mydemo5生产…

python 三引号_Python 基础(一):入门必备知识

目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级1 标识符标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数…

排序算法:冒泡和快排 摘自网络

冒泡排序: 首先我们自己来设计一下“冒泡排序”,这种排序很现实的例子就是: 我抓一把沙仍进水里,那么沙子会立马沉入水底, 沙子上的灰尘会因为惯性暂时沉入水底,但是又会立马像气泡一样浮出水面&#xff0c…

镭波笔记本安装linux,镭波笔记本windows7旗舰版系统下载与安装教程

镭波笔记本windows7旗舰版系统下载地址以及安装教程有很多盆友询问,今天,我就将镭波电脑下载安装win7旗舰版系统的详细步骤分享给你们,一起来了解一下镭波电脑是如何安装windows7旗舰版。镭波笔记本Windows7旗舰版系统下载:64位Windows7旗舰版…

linux运维和3dmax哪个简单,牛逼运维常用的工具系列-2

劳动最光荣nmonnmon是linux性能监视和分析数据的工具,它的安装很简单,下载解压后,添加可执行权限,即可运行下载解压后,通过文件名可以发现,是多个发行版本的,根据自己的发行版本,然后…

语义分割和实例分割_语义分割入门的一点总结

点击上方“CVer”,选择加"星标"或“置顶”重磅干货,第一时间送达作者:Yanpeng Sunhttps://zhuanlan.zhihu.com/p/74318967本文已由作者授权,未经允许,不得二次转载语义分割目的:给定一张图像&…

linux 音频驱动的流程,Intel平台下Linux音频驱动流程分析

【软件框架】在对要做的事情一无所知的时候,从全局看看系统的拓扑图对我们认识新事物有很大的帮助。Audio 部分的驱动程序框架如下图所示:这幅图明显地分为 3 级。上方蓝色系的 ALSA Kernel 整体属于Linux Kernel,是原生Linux 操作系统的一部…

Windows Server 2008 R2Cisco2960 配置Radius服务 实现802.1x认证 实战

实战配置Windows Server 2008 R2 Radius服务 与Cisco 2960 实现 802.1x认证实验拓扑1.Radius服务器 安装 dc 域名 wjl.com ,和ca 安装步骤不再详解2.安装完ca之后,打开MMC 添加计算机证书,查看个人-证书里面有没有ca颁发给计算机的证书&…

linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、将整数和结构体数组写到文件

参考:linux文件编程(3)—— 文件编程的简单应用:myCp、修改配置文件 作者:丶PURSUING 发布时间: 2021-04-09 23:45:05 网址:https://blog.csdn.net/weixin_44742824/article/details/115209404 …

linux 修改文件名_Linux常用命令

Linux下一切皆文件查看型ls 查看当前文件夹内容 选项 -a 查看隐藏文件 -l 查看文件详细信息pwd 查看当前所在路径su 切换用户cat /etc/passwd 查看当前系统的用户cat 文件 查看文件内容选项 -n 加上编号 -E 每行末尾加上$ifconfig 查看网卡名,IP地址等网络信息route…

c语言mfc弹出窗口函数,CMFCDesktopAlertWnd实现桌面弹出消息框

1.创建一个CMFCDesktopAlertWnd指针CMFCDesktopAlertWnd* pPopup new CMFCDesktopAlertWnd;2.设置参数pPopup->SetAnimationType((CMFCPopupMenu::ANIMATION_TYPE) 2);pPopup->SetAnimationSpeed(100);pPopup->SetTransparency((BYTE)128);pPopup->SetSmallCaptio…