Java Timer(定时器)

news2024/11/24 20:49:41

概述:

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()// 把当前任务取消

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

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

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

为了使用固定延迟调度,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() 来生成的,而这个方法并不一定是任务真实执行的时间,而是当前任务应该执行的时间。
源码理解

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

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

相关文章

【AI理论学习】Graph Embedding理论介绍及5种算法演示(DeepWalk)

Graph Embedding理论介绍及5种算法演示1.图数据结构2.图表示学习3.Graph Embedding3.1 DeepWalk算法DeepWalk算法理论DeepWalk 核心代码参考资料1.图数据结构 在现实世界中,网络只是互连节点的集合。为了表示这种类型的网络,我们需要一个与之相似的数据…

SDV进入新阶段,如何让智能汽车应用开发变得更容易?

软件定义汽车加速到来,基于域控制器架构的车型大规模量产,从域控架构到中央集成式架构,跨域融合已经成为明显趋势。 高工智能汽车研究院发布《2023-2025年智能网联产业趋势报告》显示,今年1-10月,智驾域控制器前装搭载…

【Kafka】Kafka 简介 || CentOS7 安装 Kafka || SpringBoot整合 Kafka 方式

最近的精神状态真的不是很好,刚刚脱离🐏羊的苦海,收获了很多吧,任何经历都是我们成长的关键。本文是我 Kafka 入门部分的一个笔记,大家如果有有疑问的地方可以评论区或者私信我,我看见了都会回复的。最后&a…

安卓玩机搞机技巧综合资源-----手机隐藏拍照录像 取证软件 寻找隐藏摄像头 【十六】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

计算机网络学习笔记(V):传输层

目录 1 传输层概述 1.1 功能 1.2 两种协议 1.TCP 2.UDP协议 1.3 传输层的寻址与端口 2 UDP协议 2.1 特点 2.2 首部格式 2.3 UDP检验 3 TCP协议 3.1 TCP协议 1.特点 2.报文段首部格式 3.2 TCP连接管理 1.连接建立 2.TCP连接释放 3.3 TCP可靠传输 1.校验 2.序…

java+MySQL 基于ssm的视频播放网站

随着现代视频播放网站管理的快速发展,可以说视频播放网站管理已经逐渐成为现代视频播放网站管理过程中最为重要的部分之一。但是一直以来我国传统的视频播放网站管理并没有建立一套完善的行之有效的视频播放网站管理系统,传统的视频播放网站管理已经无法适应高速发展,无论是从效…

中小型水库雨水情测报平台有哪些功能?水库雨水情数据孪生安全监测系统

平升电子中小型水库雨水情测报平台/雨水情监测及视频监控解决方案/水库雨水情数据孪生安全监测系统统辅助水利管理部门实现水库雨水情信息“全要素、全量程、全覆盖”自动测报。系统具备水库水位、雨量、现场图像/视频等水文信息采集、传输、处理及预警广播等功能,有…

美股l2接口有什么特别的功能服务?

美股l2接口主要是面向做美股投资的level2行行情接口,接下来小编说说它的两大特色! 1、买卖盘从各五档扩展到各十档 为投资者、基金、机构提供更多的交易参考数据,可以更准确地确定交易任务的完成程度。 美股l2接口(十档行情快照…

【ShaderGraph】关于ShaderGraph的的介绍和入门

目录 一.ShaderGraph入门介绍 二.创建SRP工程(URP或者HDRP) 1.创建URP工程 2.创建HDRP工程 三.创建一个Shader Graph文件资源 ​​​​​​​ 一.ShaderGraph入门介绍 Shader Graph 使您能够直观地构建着色器。您无需编写代码,而是在图…

实验室管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):模块划分:班级模块、老师模块、学生模块、实验室模块、试脸模块、作业模块、作业提交、作业打分 管理员功能&…

ICG-Carboxylic Acid ICG标记羧基

ICG-Carboxylic Acid ICG标记羧基 外观: 绿色固体粉末 CAS: 181934-09-8 分子式:C45H50N2O5S 相对分子质量(g/mol): 730.6 溶解性:DMF/DMSO 注意事项 避免长时间接触光线。 保存条件:-20避光。 产品应用 ICG是一种带负电…

OA办公系统,推动企业管理革新

近年来,随着经济形势的发展与现代互联信息技术的高速发展,OA办公系统软件逐渐为人们所熟知,成为企业管理革新的重要选择。 1.OA办公系统助力企业实现组织管理 企业OA财务费控办公系统的扁平化组织可以说是组织创新最重要的一个利器。通过OA财…

基于springboot的电影推荐网站设计与实现(协同算法推荐)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

猿如意中的【Qt Creator】工具详情介绍

一、工具名称 Qt Creator 二、下载安装渠道 Qt Creator通过CSDN官方开发的【猿如意】客户端进行下载安装。 2.1 什么是猿如意? 猿如意是一款面向开发者的辅助开发工具箱,包含了效率工具、开发工具下载,教程文档,代码片段搜索&…

2019年第一届“长安杯”电子数据取证竞赛答案解析

C D A 仿真后用uname -r查看 B PV:psycial volume VG:volume group LV:logical volume X-Ways检测的分区3、4是root和swap C LBA:Logical Block Address D 应为分区4 C D 39999->22 前面为主机端口,后面为dock…

C语言文件操作(1)

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C/C】 目录什么是文件程序文件数据文件文件名文件类型文件缓冲区文件指针什么是文件 磁盘的文件是文件 但在程序设计中,我…

诊断和响应故障_执行块介质恢复(Block Media Recovery)

本章阐述如何还原和恢复数据文件中个别的数据块。 1.块介质恢复概述 块介质恢复通过恢复损坏的数据块提供更短的平均恢复时间(MTTR)。 1.1.块介质恢复的目的 使用块介质恢复来恢复数据文件中一个或多个损坏的数据块。 块介质…

whistle修改接口返回步骤(只影响前端展示,不会插入数据到数据库)

本文章向大家介绍whistle修改接口返回步骤(只影响前端展示,不会插入数据到数据库),主要包括whistle修改接口返回步骤(只影响前端展示,不会插入数据到数据库)使用实例、应用技巧、基本知识点总结…

m基于高阶累积量和信号子空间的信噪比估计方法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着信息技术的飞速发展,信息战逐渐成为战争的一个重要方式。因此,掌握战场的信息控制权是赢得战争的重要因素。在信息战中,为了干扰和破坏对方的通信系统&…

Rvit中添加尺寸标注的前缀后缀和【一键尺寸定位标注】

一、Rvit中如何添加尺寸标注的前缀后缀 在进行尺寸标注尤其是多段连续的尺寸标注时常会用到诸如:3x20006000的标注样式,在Revt中应如何实现? 我们可以采用以下方法来解决: 1.如图1所示,先对该连续物体进行普通的对齐标…