时光机关:探秘Java中的Timer和TimerTask

news/2024/4/24 14:22:54/文章来源:https://blog.csdn.net/Mrxiao_bo/article/details/136435880

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

时光机关:探秘Java中的Timer和TimerTask

    • 前言
    • Timer和TimerTask的基本概念
      • Timer:
      • TimerTask:
      • 为何它们是 Java 中任务调度的得力工具:
    • Timer的使用方法
      • 创建和基本配置:
      • 定时任务的添加与取消:
    • TimerTask的实现与应用
      • TimerTask 的编写规范:
      • 使用 TimerTask 执行具体任务:
      • 注意事项:
    • Timer的优势与劣势
      • 优势:
      • 局限性与风险:

前言

时间是一位无情的艺术家,而在编程世界中,我们有幸能够通过Java中的Timer和TimerTask来操控时间的流逝。这就像是拥有一把神奇的时光机关,能够指挥任务在特定时刻执行。让我们一同揭开这时光机关的神秘面纱,探索其中蕴含的奥秘。

Timer和TimerTask的基本概念

TimerTimerTask 是 Java 标准库中用于任务调度的两个类,它们的基本概念如下:

Timer:

  • 定义: Timer 是一个用于安排指定任务在未来执行的工具类。它允许你指定延迟时间,以及执行任务的时间间隔。

  • 基本用途: Timer 主要用于执行重复性任务或者在一段延迟之后执行任务。它提供了计划执行任务的能力,使得你可以在指定的时间点执行某个任务,也可以周期性地执行任务。

TimerTask:

  • 定义: TimerTask 是一个抽象类,实现了 Runnable 接口。它表示一个可以由 Timer 执行的任务。

  • 基本用途: TimerTask 用于封装要执行的任务逻辑,它的 run() 方法中包含了具体的任务代码。通过继承 TimerTask,你可以创建自己的任务类,然后由 Timer 来调度执行。

为何它们是 Java 中任务调度的得力工具:

  1. 简单易用: TimerTimerTask 提供了一个相对简单的 API,使得任务调度变得易于实现。通过创建 TimerTask 的子类并使用 Timer 调度,可以轻松地安排任务的执行。

  2. 定时任务: 它们支持对任务的定时调度,即在未来的某个时间点执行任务。这对于需要周期性执行任务或者在特定时间执行任务的场景非常有用。

  3. 轻量级: TimerTimerTask 是 Java 标准库的一部分,因此它们是轻量级的工具。不需要引入额外的库或框架,即可完成基本的任务调度需求。

  4. 周期性执行: Timer 可以用于安排任务的周期性执行,例如每隔一定的时间间隔执行一次。这对于定时任务、定时器等场景非常有用。

尽管 TimerTimerTask 提供了一些简单和基础的任务调度功能,但在一些高级的场景中,可能会面临一些限制。例如,如果一个任务执行时间较长,可能会影响后续任务的调度。在这种情况下,使用更灵活和功能强大的调度工具,如 ScheduledExecutorService 或第三方调度框架,可能更为合适。

Timer的使用方法

Timer 类用于安排任务在未来执行,其使用方法涉及到创建、基本配置、定时任务的添加和取消。下面是 Timer 的基本使用方法:

创建和基本配置:

  1. 创建 Timer 实例:

    Timer timer = new Timer();
    
  2. 创建 TimerTask 实例(自定义任务):

    TimerTask task = new TimerTask() {@Overridepublic void run() {// 定时任务执行的逻辑System.out.println("Task executed at: " + new Date());}
    };
    

定时任务的添加与取消:

  1. 添加定时任务:

    // 在延迟一定时间后执行任务
    timer.schedule(task, 1000); // 1秒后执行// 在指定时间点执行任务
    Date executionTime = new Date(System.currentTimeMillis() + 5000);
    timer.schedule(task, executionTime); // 5秒后执行
    
  2. 周期性执行任务:

    // 在延迟一定时间后,每隔一定时间执行任务
    timer.schedule(task, 1000, 2000); // 1秒后开始执行,每2秒执行一次
    
  3. 取消定时任务:

    TimerTask taskToCancel = ...; // 需要取消的任务实例
    taskToCancel.cancel(); // 取消任务
    
  4. 关闭 Timer

    timer.cancel(); // 关闭Timer,取消所有已安排但尚未执行的任务
    

注意事项:

  • 当使用 schedule 方法添加任务时,如果任务抛出未捕获的异常,Timer 将终止执行所有已安排的任务。因此,在任务中要进行异常处理,以确保不会导致 Timer 终止。
  • Timer 不适用于需要精确控制的场景,因为它是单线程的,如果一个任务的执行时间过长,可能会影响后续任务的调度。
  • 如果需要更灵活的任务调度和管理,可以考虑使用 ScheduledExecutorService 接口,它提供了更丰富的功能和更好的控制能力。

总体而言,Timer 是一个简单的定时任务调度工具,适用于一些基本的任务调度需求。在一些复杂或高级的场景中,可能需要考虑使用其他调度工具。

TimerTask的实现与应用

TimerTask 是一个抽象类,实现了 Runnable 接口,用于表示可以由 Timer 调度执行的任务。以下是 TimerTask 的实现规范和使用方法:

TimerTask 的编写规范:

  1. 继承 TimerTask 类: 创建一个类并继承 TimerTask

    import java.util.TimerTask;public class MyTask extends TimerTask {@Overridepublic void run() {// 任务执行的逻辑System.out.println("Task executed at: " + System.currentTimeMillis());}
    }
    
  2. 重写 run 方法:run 方法中编写任务的具体逻辑。这个方法将在定时任务执行时被调用。

  3. 异常处理:run 方法中处理可能发生的异常,确保不会导致 Timer 终止执行所有已安排的任务。

使用 TimerTask 执行具体任务:

  1. 创建 Timer 实例:

    import java.util.Timer;Timer timer = new Timer();
    
  2. 创建 TimerTask 实例:

    TimerTask myTask = new MyTask();
    
  3. 安排任务的执行:

    • 在延迟一定时间后执行任务:

      timer.schedule(myTask, 1000); // 1秒后执行
      
    • 在指定时间点执行任务:

      long executionTime = System.currentTimeMillis() + 5000;
      timer.schedule(myTask, new Date(executionTime)); // 5秒后执行
      
    • 周期性执行任务:

      timer.schedule(myTask, 1000, 2000); // 1秒后开始执行,每2秒执行一次
      
  4. 取消任务的执行:

    myTask.cancel(); // 取消任务的执行
    
  5. 关闭 Timer:

    timer.cancel(); // 关闭 Timer,取消所有已安排但尚未执行的任务
    

注意事项:

  • 任务的执行时间不应过长,以免影响后续任务的调度。
  • 尽量处理任务中可能抛出的异常,以确保不会导致 Timer 终止执行所有已安排的任务。
  • 在多线程环境中使用 TimerTimerTask 时要谨慎,可以考虑使用更现代的调度工具,如 ScheduledExecutorService

总体而言,TimerTask 提供了一种简单的方式来定义和执行定时任务,适用于一些基本的调度需求。在一些复杂或高级的场景中,可能需要考虑使用其他调度工具。

Timer的优势与劣势

优势:

  1. 简单易用: Timer 提供了一个相对简单的 API,易于上手,对于一些简单的定时任务场景,使用起来非常方便。

  2. 轻量级: Timer 是 Java 标准库的一部分,无需引入额外的库或框架,因此是一个轻量级的调度工具。

  3. 基本的定时任务调度: 对于一些简单的定时任务场景,例如在指定时间点执行任务、周期性执行任务等,Timer 能够满足基本的需求。

  4. 易于理解和调试: 由于 Timer 提供的功能相对简单,任务的添加、取消等操作都比较直观,易于理解和调试。

局限性与风险:

  1. 单线程执行: Timer 是单线程的,如果一个任务的执行时间过长,可能会影响后续任务的调度。一个长时间运行的任务会推迟后续任务的执行,因为任务是按照顺序执行的。

  2. 异常处理不足: Timer 的异常处理机制相对简单,如果一个任务抛出未捕获的异常,Timer 将终止执行所有已安排的任务,可能会导致整个调度系统的不稳定。

  3. 不适合复杂任务场景: 对于一些复杂的任务调度场景,例如需要更高级的调度策略、任务间的依赖关系等,Timer 可能显得力不从心,因为其功能相对有限。

  4. 定时器线程的生命周期管理: Timer 的定时器线程在 cancel 方法被调用后不会被及时终止,可能导致应用程序无法正常退出。需要谨慎管理定时器线程的生命周期。

  5. 不支持任务的取消和修改: 一旦定时任务被安排,就不能取消或修改其执行时间,只能取消整个定时器并重新创建。

总体而言,Timer 适用于一些简单的、单线程执行的定时任务场景,但在一些复杂、高并发或需要更高级调度功能的情况下,可能需要考虑使用其他调度工具,如 ScheduledExecutorService 或第三方调度框架。

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

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

相关文章

python中的文件操作2

文件遍历 在Python中,遍历文件通常指的是逐行读取文件中的内容。这种方式对于处理大型文件特别有用,因为它不需要一次性将整个文件加载到内存中。下面是几种常见的遍历文件内容的方法: 1. 使用with语句和for循环 这是最推荐的方式&#xf…

appium解锁android真机系统的屏幕

在使用appium进行app自动化操作的过程中,经常遇到的第一个难题就是如何解锁系统屏幕,也就是亮屏解锁。 实际上解决办法如下:在desired_capabilities中增加两个参数unlockType和unlockKey,类似的示例代码如下: desire…

外包干了2年,技术退步明显

先说一下自己的情况,研究生,19年进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Stable Diffusion 模型分享:Realistic Stock Photo(真实的库存照片)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍

利用Python爬取高德地图全国地铁站点信息

利用Python中的requests库进行地铁站点信息的获取,同时将数据保存在本机excel中 # 首先引入所需要的包 import requests from bs4 import BeautifulSoup import pandas as pd import json# 发送 GET 请求获取网页内容 url http://map.amap.com/subway/index.html response r…

vue3页面内容切换(类似登录、注册内容切换)

一、内容描述 页面有俩块内容,分别是验证码登录页面内容,账号密码登录页面内容。有俩种处理方式,一个是写俩个页面跳转使用,还有一种是一个页面俩个内容,切换的只是不同的内容,相同的内容保留。一般都是选择…

比肩Gen-2,全新开源文生视频模型

著名开源平台Stability.ai在官网宣布,推出全新文生视频的扩散模型Stable Video Diffusion,已开源了该项目并公布了论文。 据悉,用户通过文本或图像就能生成高精准,14帧和25帧的短视频。目前,Stable Video Diffusion处…

【常见索引使用】⭐️Mysql中索引的类型以及使用方式和失效场景

目录 一、前言 二、数据准备 三、索引的分类 四、索引示例 示例1、主键索引(Primary Key Index)与 唯一索引(Unique Index) 示例2、前缀索引(Prefix Index) 示例3、联合索引(复合索引&am…

Unity3D学习之XLua实践——背包系统

文章目录 1 前言2 新建工程导入必要资源2.1 AB包设置2.2 C# 脚本2.3 VSCode 的环境搭建 3 面板拼凑3.1 主面板拼凑3.2 背包面板拼凑3.3 格子复合组件拼凑3.4 常用类别名准备3.5 数据准备3.5.1 图集准备3.5.2 json3.5.3 打AB包 4 Lua读取json表及准备玩家数据5 主面板逻辑6 背包…

什么是工业协议网关?作用是什么?

在工业自动化和智能制造领域,数据的采集、传输和处理是实现设备监控、远程控制和优化的关键。而工业协议网关,作为连接工业设备与上层管理系统的桥梁,发挥着至关重要的作用。今天,我们就来深入解析一下HiWoo Box这一工业协议网关的…

【three.js】22. Imported Models导入模型

22. Imported Models导入模型 介绍 Three.js 可以让你创建很多原始几何体,但是当涉及到更复杂的形状时,我们最好使用专用的 3D 软件建模。 在本课中,我们将使用已经制作好的模型,但我们将在以后的课程中学习如何完全在 3D 软件中…

《汇编语言》第3版 (王爽)第10章检测点解析

第10章 检测点 检测点10.1:补全程序,实现从内存1000:0000处开始执行指令。 解析: 我们知道retf指令是用栈中的数据,同时修改CS和IP寄存器中的内容,实现远转移,而且是先出栈的数据放入IP中,后出栈的数据放入…

IPSEC VPN 网关模式实验

要求:FW1与FW3建立IPSEC通道,保证10.0.2.0/24网段能访问192.168.1.0/24网段 因为FW1与FW3都处于边界,所以使用网关部署模式来建立IPSEC VPN FW1 这里选择主模式跟隧道模式 FW3与FW1配置类似,与FW1的源目地址反过来,…

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody,我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方(毕竟基于烘焙过的导航网格),一般常见于元宇宙应用和mmo。 根据Unity手册,NavMeshAgent 也有和…

STM32 (1)

1.基本信息 stm32是由ST公司生产的一种32位微控制器(单片机)。 1.1 各种型号 stm32是32位单片机的总称,有多种不同的系列。 32即用32个比特位表示一个地址,寻址范围:0x00000000 --0xffffffff (4GB) 1.2 存储密度 …

网络编程作业day6

数据库操作的增、删、改完成 #include <myhead.h>//查询的回调函数 int callback(void* data,int count,char** argv, char** columnName) {//count是字段数//argv是字段内容//columnName是字段名称for(int i0;i<count;i) {printf("%s%s\n", columnName[…

【unity实战】事件(Event)的基本实战使用

文章目录 最终效果前言一、素材二、角色金币交互1. 拾取金币2. 显示金币数UI 完结 最终效果 前言 之前我们介绍过委托的用法&#xff0c;具体可以跳转&#xff1a;【unity小技巧】委托&#xff08;Delegate&#xff09;的基础使用和介绍 这期来讲讲事件&#xff0c;使用你会发…

Java线程状态解析:多线程编程指南

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 &#x1f31f;1. 引言&#x1f31f;2. Java线程的生命周期&#x1f4a1;2.1 <font color "skyblue">新建&#xff08;New&#xff09;&…

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、分析一下源码以及闯关思路 首先是有一个函数循环以及函数过滤&#xff0c;我们的post会将我们所传的所有val值去进行一个循环&#xff0c;之后通过htmlspecialchars这个函数进行过滤和转换所以val值不能通过单双引号闭合注入的方…

HarmonyOS NEXT应用开发案例——全屏登录页面

全屏登录页面 介绍 本例介绍各种应用登录页面。 全屏登录页面&#xff1a;在主页面点击跳转到全屏登录页后&#xff0c;显示全屏模态页面&#xff0c;全屏模态页面从下方滑出并覆盖整个屏幕&#xff0c;模态页面内容自定义&#xff0c;此处分为默认一键登录方式和其他登录方…