位置: IT常识 - 正文

Java Timer(定时器)(java定时器怎么用)

编辑:rootadmin
Java Timer(定时器) 概述:Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以安排任务“执行一次”或者定期“执行多次”。 然而在实际的开发过程当中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。 对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。方法摘要:schedule(TimerTask task, Date time) // 安排在 "指定的时间" 执行 指定的任务。(只执行一次)schedule(TimerTask task,long delay) // 安排在指定延迟后执行指定的任务schedule(TimerTask task, Date firstTime , long period) // 安排指定的任务在 "指定的时间 " 开始进行 "重复" 的固定延迟执行schedule(TimerTask task,long delay,long period)// 安排指定的任务指定的延迟后开始进行重复的固定延迟执行.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)// 安排指定的任务在指定的时间开始进行重复的固定速率执行.scheduleAtFixedRate(TimerTask task,long delay,long period)//安排指定的任务在指定的延迟后开始进行重复的固定速率执行.Timer.cancal()// 终止此计时器,丢弃所有当前已安排的任务。Timer.purge()// 从此计时器的任务队列中移除所有已取消的任务。TimerTask.cancal()// 把当前任务取消

推荐整理分享Java Timer(定时器)(java定时器怎么用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java定时器怎么用,java 定时器schedule,java定时器时间格式,java定时器时间格式,java 定时器时间表达式,java定时器时间格式,java定时器的使用,java 定时器时间表达式,内容如对您有帮助,希望把文章链接给更多的朋友!

固定延迟:意味着执行将在最后一次执行开始后的一段时间内开始,即使它被延迟(因此它本身被延迟)。也就是说任务的 下一次执行时间 是相对于 上一次实际执行完成的时间点 ,因此执行时间会不断延后

固定频率:意味着每次执行都将遵守初始计划,无论之前的执行是否被延迟。也就是说任务的 下一次执行时间 是相对于 上一次开始执行的时间点 ,因此执行时间不会延后

关于这两种调度方式,让我们看看如何使用它们:

Java Timer(定时器)(java定时器怎么用)

为了使用固定延迟调度,schedule()方法还有两个重载,每个重载都使用一个额外的参数来表示以毫秒为单位的周期性。为什么两次重载?因为仍然有可能在某个时刻或某个延迟之后开始执行任务。

至于固定频率调度,我们有两个scheduleAtFixedRate()方法,它们的周期也是以毫秒为单位的。同样,我们有一种方法可以在给定的日期和时间启动任务,还有一种方法可以在给定的延迟后启动任务。

注意一点:如果一个任务的执行时间超过了执行周期,那么无论我们使用固定延迟还是固定速率,它都会延迟整个执行链。(固定速率会连续执行,固定延迟会等待延迟再执行)

具体代码schedule(TimerTask task, Date time)/** * @PROJECT_NAME: demo * @DESCRIPTION: 指定时间执行 */public class TimerDemo { public static void main(String[] args) { Calendar ca = Calendar.getInstance(); System.out.println(ca.getTime()); ca.set(Calendar.SECOND, ca.get(Calendar.SECOND) + 5); new Timer().schedule(new TimerTask() { @Override public void run() { System.out.println(new Date(scheduledExecutionTime()); } }, ca.getTime()); }}schedule(TimerTask task,long delay)/** * @PROJECT_NAME: demo * @DESCRIPTION: 延迟指定时间后执行 */public class DelayDemo { public static void main(String[] args) { System.out.println(new Date()); new Timer().schedule(new TimerTask() { @Override public void run() { System.out.println(new Date(scheduledExecutionTime()); } }, 2000); }}schedule(TimerTask task, Date firstTime, long period)/** * @PROJECT_NAME: demo * @DESCRIPTION: 安排指定的任务在 "指定的时间 " 开始进行 "重复" 的固定延迟执行 */public class FirstAndPeriodDemo { public static void main(String[] args) { Calendar ca = Calendar.getInstance(); System.out.println(ca.getTime()); ca.set(Calendar.SECOND, ca.get(Calendar.SECOND) + 2); new Timer().schedule(new TimerTask() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new Date(scheduledExecutionTime())); } }, ca.getTime(),2000); }}

第一次任务延迟了2s,然后之后因为实现线程执行时间为3s,所以在任务结束时在开始下一次任务。

schedule(TimerTask task,long delay,long period)/** * @PROJECT_NAME: demo * @DESCRIPTION: 安排指定的任务在“指定的延迟”后开始进行“重复”的固定延迟执行 */public class DelayAndPeriodDemo { public static void main(String[] args) { System.out.println(new Date()); new Timer().schedule(new TimerTask() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new Date(scheduledExecutionTime())); } }, 1000,2000); }}

scheduleAtFixedRate(TimerTask task,Date firstTime,long period)/** * @PROJECT_NAME: demo * @DESCRIPTION: */public class FixAndFirstDemo { public static void main(String[] args) { System.out.println(new Date()); new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new Date(scheduledExecutionTime())); } }, 1000, 2000); }}

按照固定速率执行。 但是,这儿引出了另外一个问题。既然 Timer 内部是单线程实现的,在执行间隔为2秒、任务实际执行为3秒的情况下, scheduleAtFixedRate 是如何做到2秒输出一次的呢?

【特别注意】

这儿其实是一个障眼法。需要重点关注的是,打印方法输出的值是通过调用 scheduledExecutionTime() 来生成的,而这个方法并不一定是任务真实执行的时间,而是当前任务应该执行的时间。 源码理解

本文链接地址:https://www.jiuchutong.com/zhishi/299447.html 转载请保留说明!

上一篇:前端搭建小人逃脱游戏(内附源码)

下一篇:微信小程序支付完整流程(前端)(微信小程序支付接口调用)

  • 预交所得税分录怎么写
  • 自来水适用高税率吗
  • 公司代扣代缴个人所得税如何退税
  • 冲减产品成本会计分录
  • 固定资产暂估入账的账务处理
  • 开办费用属于什么科目
  • 科技公司出售市场价格
  • 公司外部人员可以直接在公司报销吗
  • 股东贷款可以转给其他人吗
  • 简易征收税额航天信息服务费可以抵扣吗?
  • 建筑企业在境外施工税收一共包括几个部分
  • 最新土地增值税筹划
  • 加权投资年限怎么计算
  • 一般纳税人交税标准是多少
  • 异常抵扣凭证进项税转出入哪个所属期
  • 多交的增值税可以抵所得税吗?
  • 摊销费用多做如何做账?
  • win10开机内存占用60% 8g占用过高
  • 企业所得税税前扣除管理办法2018
  • 收到棚户区改造资金
  • 材料发票入账
  • php trim()
  • 营改增后企业一般纳税人认定标准为
  • 发票上可以盖财务专用章和发票专用章吗
  • php foreach循环遍历数组
  • 增值税留抵退税怎么操作
  • 幼儿园会计需要什么条件
  • php日期时间函数
  • yolov3原理及代码解析
  • yolo v1 pytorch源代码
  • 编制资产负债表的基础
  • 火遍全网的超燃神曲旋律震撼人心,听完热血沸腾!
  • jquery 元素
  • 长期待摊费用的摊销分录
  • 从汽车生产到销售有哪些过程
  • 预缴税款从哪里查
  • 保障金计入什么科目
  • python.mat
  • SQLITE3 使用总结
  • 政府扶持资金所得税税率
  • 床垫发票
  • 无偿提供建筑服务缴纳增值税
  • 报销宽带费属于什么费用
  • 商品削价的核算
  • 衍生工具什么意思
  • 企业分期收款销售商品,即商品已经交付
  • 收取会费
  • 去年多交所得税今年怎么处理
  • 银行收到客户货款会计分录
  • 其他应收款坏账准备计提标准
  • 企业账务流程
  • 应收账款周转率计算公式
  • 对公账户是不是哪个银行都可以
  • 鉴证咨询服务费可以抵扣吗
  • 消耗性生物资产属于非流动资产吗
  • 企业弥补亏损的顺序
  • 支付给个人的劳务费需要发票吗
  • 支付代理费计入什么科目
  • 银行日记账年底是0第二年年初怎么写
  • 解析关于sql语句的实现
  • mysql查看查询耗时
  • 添加网络打印机找不到设备
  • linux路由是干嘛的
  • un安装失败
  • 永恒之塔客户端是32位
  • musirc4.71.exe - musirc4是什么进程文件 有什么作用
  • root什么玩意
  • win8系统如何恢复出厂设置
  • jquery 点击按钮
  • 前端node跨域处理
  • xp没有我的电脑图标怎么办
  • 表格高级使用技巧视频
  • vue实战案例
  • 简述javascript中的函数
  • javascript密码框
  • 纳税申报表如何打印
  • 国税系统升级后怎么添加办税人
  • 国企划拨用地改制处置
  • 天津普通发票查询平台
  • 建筑公司报销流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设