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

news2024/10/25 12:29:16

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


在这里插入图片描述

时光机关:探秘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() {
        @Override
        public 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 {
        @Override
        public 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.coloradmin.cn/o/1497571.html

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

相关文章

AI生成的图片,真没那么好分辨,一不留神就会被骗

我们先来做个小测试,30秒时间快速找出下面哪个图是真人,哪个是A生成的?答案揭晓:第1张是真人,第2张是AI 在AI技术如此发达的今天,很多人都没办法轻易辨别出来。AI越来越会“欺骗”大家的眼睛了。 当然&am…

python小白考教资(教资中的简单编程)

首先,写习惯了c语句的我(虽然也会一丢丢),当然得深知python与C语言的一些简单的语句区别,这里为什么我要学习python呢,因为有些题目,python一句话就可以解决,但是以我的水平&#xf…

学习JAVA的第十四天(基础)

目录 Collection集合 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 遍历 数据结构 栈 队列 数组 链表 前言: 学习JAVA的第十三天 Collection集合 Collection的遍历方式: 迭代器(不依赖索引)遍…

【黑马程序员】C++项目之机房预约管理系统实战

文章目录 需求系统简介身份介绍机房介绍申请简介系统具体需求 实现菜单与退出功能实现功能测试 创建身份类创建角色基类创建学生类创建教师类创建管理员类 登录模块功能描述登录函数封装各个校色具体登录验证管理员操作界面调用流程 管理员模块构造函数实现管理员子菜单显示添加…

Leetcode : 147. 对链表进行插入排序

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输…

上门预约平台有哪些优势和特点

在着手开发之前,市场调研是不可或缺的步骤。它能帮助我们深入了解当前上门按摩市场的供需状况及竞争态势,进而挖掘潜在用户的真实需求和期望。这些宝贵的信息将成为我们塑造产品特性和锁定目标用户群体的关键。 紧接着,根据市场调研的反馈&am…

python将conda环境打入docker环境中

1.假设你本地已经安装好了conda相关的 ubuntu安装python以及conda-CSDN博客 并且已经创建启动过相关的环境,并且install了相关的包。 我本地的conda环境叫做,gptsovits_conda3 2.下载conda打包工具 conda install conda-pack pip install conda-pack 3.打包 con…

EXTI外部中断以及示例

中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源。比如对于外部中断来说,可以是引脚发生了电平跳变;对于定时器来说,可以是定时的时间到了;对于串口通信来说,可…

142.乐理基础-音程的构唱练习

内容参考于:三分钟音乐社 上一个内容:141.乐理基础-男声女声音域、模唱、记谱与实际音高等若干问题说明-CSDN博客 本次内容最好去看视频: https://apphq3npvwg1926.h5.xiaoeknow.com/p/course/column/p_5fdc7b16e4b0231ba88d94f4?l_progra…

Eclipse左边project框如何打开?

1、点击Eclipse顶端window 2、点击Show View 3、点击Project Explorer。 如下图(图片转自其他博主)。

C++项目--高并发内存池

目录 一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc 三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比 四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体…

[c/c++] const

const 和 #define 的区别 ? const 和指针一块出现的时候,到底谁不能修改 ? const 和 volatile 能同时修饰一个变量吗 ? const 在 c 中的作用 ? 1 const 和 #define 的区别 const 和 #define 的相同点: (1) 常数 const 和 #define 定…

vue3中el-input输入无效的原因之一

表单的model用的是:reactive let updateForm reactive({ id: 0, className: "" }); reactive的数据不能这么赋值,会破坏响应性 错误方法(){ updateForm { id: 0, className: "asdasdas" }; } 解决方法&…

【Qt】初识Qt

文章目录 一. 行业岗位介绍二. 什么是客户端?三. GUI 开发的各自技术方案四. 什么是框架?五. Qt 的发展史五. Qt 支持的系统六. Qt 的优点 一. 行业岗位介绍 二. 什么是客户端? 既然 Qt 是用来进行客户端开发的,那我们就要了解什…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档,但是没有书签,八百多页的内容查找和跳转都不方便,本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤:1&#xff…

Java EE之线程安全问题

一.啥是线程安全问题 有些代码,在单个线程执行时完全正确,但同样的代码让多个线程同时执行,就会出现bug。例如以下代码: 给定一个变量count,让线程t1 t2分别自增5000次,然后进行打印,按理说co…

小游戏加固方案已全面适配微信、QQ、抖音、快手、美团、华为、支付宝渠道

2023年,国内移动游戏收入与游戏用户规模双双创下历史新高。其中小游戏异军突起,市场规模达到200亿元,同比增长300%,成了万众瞩目的行业新风口。 小游戏的高速发展带来了更多的活力,产出了多款月流水过亿的热门游戏。行…

深入解析Mybatis-Plus框架:简化Java持久层开发(八)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 本章节介绍如何通过Mybatis-Plus更新数据库中的数据。 本章节不需要前置准备,继续使用之前的测试类,数据库表进行操作。 &#x1f4…

基于单片机的机动车智能远光灯系统设计

目 录 摘 要 I Abstract II 引 言 1 1 主要研究内容及总体设计方案 3 1.1 主要研究内容 3 1.2 系统总体方案选择 3 1.3 系统功能的确定 4 2 硬件电路的设计 5 2.1 单片机控制模块设计 5 2.2 液晶显示模块电路设计 7 2.3 远近灯光电路设计 9 2.4 按键电路设计 9 2.5 超声波电路…

XSS渗透与防御

一、HTTP协议回顾 二、客户端的Cookie 三、服务端的Session 四、JavaScript操作Cookie 使用js语法查看当前网站的cookie 使用js语法添加cookie值 添加unamewuya 刷新网页可以看到添加的cookie值已经发送给服务器 五、脚本注入网页-XSS 六、XSS检测和利用 xsser可以检测网页是…