Java定时器Timer的源码分析

下面是“Java定时器Timer的源码分析”的完整攻略。

一、概述

java.util.Timer 是一个简单的线程定时器,它允许您在未来一个指定的时间段内执行单个或重复的任务。

Timer 的 API 相对简单,但是它是在单线程中运行的。因此,如果一个任务的执行时间很长,那么以后所有任务的执行都将受到影响。

Timer 类仅仅用于在一个线程中顺序执行执行 Runnable 的任务, 如果有多个任务或轮子任务需要执行,则可以考虑使用线程池。

二、源码分析

1. Timer 和 TimerTask

java.util.Timer 类和 java.util.TimerTask 类是 Java 定时器的基础类, Timer 是定时器类, TimerTask 则是执行任务的抽象类。

其中,Timer 负责调度任务,而 TimerTask 负责执行任务。

Timer 会根据 TimerTask 的时间间隔和延时时间在后台线程中计划执行 TimerTask。Timer 的主要方法主要包括:

  • public void schedule(TimerTask task, long delay):在指定的延迟(以毫秒为单位)后安排指定的任务。此时任务只会执行一次。
  • public void schedule(TimerTask task, long delay, long period):在指定的延迟(以毫秒为单位)后安排指定的任务,然后按指定的间隔时间重复执行。即使任务的执行结果不需要使用,此时也必须使用此方法。
  • public void scheduleAtFixedRate(TimerTask task, long delay, long period):在指定的延迟(以毫秒为单位)后安排指定的任务,然后按指定的既定速率重复执行。

TimerTask 类的主要方法如下:

  • public void run():任务要执行的操作在此方法中实现。
  • public boolean cancel():取消此任务。如果任务已经被调度或正在执行,则返回 false。否则返回 true。
  • public long scheduledExecutionTime():返回此任务将要执行的时间。

2. Timer 类的相关属性

Timer 类中有两个相关属性,如下:

  • private final TaskQueue queue = new TaskQueue():一个优先级队列,按时间排序。它存储所有准备运行的 TimerTask。

  • private final TimerThread thread = new TimerThread(queue):TimerThread 是一个后台线程,他在读取队列中任务并调度他们。

3. TimerThread 类

TimerThread 是一个直接继承 Thread 类的内部类,其 run() 方法重复执行一个死循环来处理队列中的 TimerTask。

TimerThread 主要方法如下:

  • void schedule(TimerTask task):调度任务,将其加入队列中。

  • void remove(TimerTask task):从队列中移除任务。

  • private void mainLoop():死循环读取队列中任务,然后调用 TimerTask 的 run() 方法。

三、示例

下面是两个使用示例:

示例一:

下面的 Java 成员方法演示了如何使用 Timer 通过计划任务来重复执行代码。

public void runTimer() {
    Timer timer = new Timer();

    TimerTask task = new TimerTask() {
        public void run() {
            System.out.println("Hello from Timer!");
        }
    };

    timer.schedule(task, 0L, 1000L);
}

这个程序利用 Timer 和 TimerTask 安排任务。代码将打印“Hello from Timer!”的消息,每 1000 毫秒一次。

示例二:

下面的 Java 成员方法演示了如何使用 Timer 和 TimerTask 将程序计划在未来指定的时间运行一次。

public void runTimer() {
    System.out.println("Main thread: Starting the timer at "+new Date());

    Timer timer = new Timer();

    TimerTask task = new TimerTask() {
        public void run() {
            System.out.println("Other thread: Hello from TimerTask at "+new Date());
        }
    };

    timer.schedule(task, 5000L); // Run the task in 5 seconds
}

这个程序使用 Timer 和 TimerTask 安排任务,在 5 秒后打印“Hello from TimerTask”。

四、总结

Java 提供了简单易用的定时器实现, Timer 可以在未来指定的时间段内执行单个或重复的任务。但是,需要注意 Timer 这个类只适用于在单线程中运行的场景,如果有多个任务或轮子任务需要执行,则可以考虑使用线程池。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java定时器Timer的源码分析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 关于@JSONField和@JsonFormat的使用区别说明

    当我们在Java中使用JSON进行数据传递和解析时,通常使用的是JSON格式。在进行序列化和反序列化时,我们会经常使用@JSONField和@JsonFormat注解。虽然它们都可以在实现JSON序列化和反序列化时使用,但它们在使用时有一些区别。 @JSONField 和 @JsonFormat 的使用区别说明 1. @JSONField注解 该注解通常用于…

    Java 2023年5月26日
    00
  • Java持久层框架Mybatis入门详细教程

    Java持久层框架Mybatis入门详细教程 什么是Mybatis? Mybatis是一种ORM(Object Relational Mapping)框架,它把数据库操作转换为面向对象编程语言的操作,让我们可以通过调用一个接口即可实现对数据库的CRUD操作,极大地提高了开发的效率。同时,Mybatis还具有可扩展、灵活性高、易于调试等特点,被广泛应用于Jav…

    Java 2023年5月20日
    00
  • GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署

    “GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署” 是一个使用开源工具链来实现软件开发流程自动化的典型例子。在本文档中,我们将详细介绍如何将这些工具整合起来,实现自动化集成、打包、部署。 准备工作 GitLab的安装 在你的服务器上安装 GitLab 这个基于 Git 的代码仓库管理系统,并确保它已经正确的配置好了 ssh …

    Java 2023年5月19日
    00
  • java.lang.Void类源码解析

    Java.lang.Void类源码解析 Java.lang.Void类是Java语言中一种特殊的“虚无”类型,该类型用于表示方法没有返回值的情况。本文将解析该类的源代码实现原理。 Void类的定义 Java.lang.Void类是一个final修饰的类,不能被继承。该类的源代码如下所示: public final class Void { /** * The…

    Java 2023年5月26日
    00
  • Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析

    Java多线程Queue和BlockingQueue介绍 Java多线程Queue是Java语言中非常重要的多线程库,它们提供了一些工具和数据结构来帮助我们开发多线程应用程序。其中,BlockingQueue是具有阻塞功能的队列。 Queue是什么 Queue是Java中一种非常通用的集合类,是队列的一种实现。Queue本身不是线程安全的,多线程使用时需要进…

    Java 2023年5月18日
    00
  • java 文件上传(单文件与多文件)

    好的。对于Java文件上传,常见的方式有单文件上传和多文件上传两种。 一、单文件上传 1.前端通过表单实现文件选择和提交操作,后端利用Apache的FileUpload组件进行接收处理。 <form action="upload" enctype="multipart/form-data" method=&quo…

    Java 2023年5月20日
    00
  • SpringBoot 如何自定义请求参数校验

    根据您的需求,我会详细讲解 SpringBoot 如何自定义请求参数校验的完整攻略。 1. 简介 SpringBoot默认使用 Hibernate Validator 作为参数校验的实现库(底层实现其实是 JSR-303 Bean Validation 规范)。在进行参数校验时,我们通常会使用一组预定义好的注解,如:@NotNull、@Min、@Max、@S…

    Java 2023年5月20日
    00
  • Java中Servlet的生命周期详解

    让我给你详细讲解一下 “Java中Servlet的生命周期详解”的完整攻略。 什么是Servlet生命周期 Servlet生命周期指的是Servlet从创建到销毁的整个过程,包括初始化、服务和销毁三个过程。 Servlet生命周期的三个阶段 初始化阶段 在初始化阶段,Servlet容器创建Servlet实例,并调用init()方法初始化Servlet。在这个…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部