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日

相关文章

  • Java中关于字符串的编码方式

    Java中关于字符串的编码方式,是指将字符串表示成一系列的字节序列的方式。在Java中,常见的字符串编码方式有ASCII编码、Unicode编码和UTF-8编码。 ASCII编码 ASCII编码是最基本的字符编码,它将每个字符表示成一个8位的字节,可以表示128个不同的字符。在Java中,可以使用String类的getBytes()方法将字符串按照ASCII…

    Java 2023年5月20日
    00
  • 一文带你认识Java中的Object类和深浅拷贝

    一文带你认识Java中的Object类和深浅拷贝 1. Object类 在Java中,所有的类都是从java.lang.Object类继承而来的。因此,java.lang.Object是Java中的祖先类,拥有以下常用的方法: equals(Object obj): 判断当前对象是否与参数obj相等,可以重写该方法来实现对象的比较 hashCode(): 返…

    Java 2023年5月19日
    00
  • 详解Java中的反射机制和动态代理

    详解Java中的反射机制和动态代理 什么是反射机制 反射机制是Java语言中的一种机制,它可以在程序运行时获取一个类的信息,包括类的名称、父类、接口、属性、方法等,还可以在运行时获取和设置对象的属性和方法,创建对象并调用方法。 Java中的反射机制主要包括以下几个类: Class:代表一个类,可以获取一个类的信息,如名称、直接父类、实现的接口、构造方法、属性…

    Java 2023年5月20日
    00
  • java8 Stream流逐行处理文本文件

    下面我将详细讲解一下如何使用Java8的Stream流逐行处理文本文件。 1. 什么是Java8的Stream流? Stream流是Java8引入的一个新特性,它可以将一组数据看作是一条流,在这条流上进行各种操作,比如筛选、排序、映射等操作。其中,最重要的一个特点是Stream流是“懒加载”,只有在真正需要数据的时候才会去加载,这也是其具有高效性的重要原因。…

    Java 2023年5月20日
    00
  • apache SHTML网页SSI使用详解

    Apache SSI 网页 SHTML 使用详解 SSI 简介 SSI,Server Side Includes,也称为服务器端包含。SSI 是一种在 Web 服务器上进行的处理方式,它能够对页面进行特殊处理,并将处理后的结果输出到客户端。对于 Apache HTTP Server,SSI 可以通过 mod_include 模块实现。 SHTML 简介 SH…

    Java 2023年6月15日
    00
  • Java实现的图像查看器完整实例

    针对“Java实现的图像查看器完整实例”的完整攻略,以下是详细的步骤: 1. 准备工作 首先,需要准备好开发所需要的环境和工具,主要包括: JDK:Java 开发环境,可以到 Oracle 官网下载; Eclipse:Java 开发工具,可以到 Eclipse 官网下载; Java Swing 包:Java 自带的 GUI 组件库,用于图形界面设计。 2. …

    Java 2023年5月19日
    00
  • Java实现图片上传至FastDFS入门教程

    下面我将为你详细讲解Java实现图片上传至FastDFS入门教程的完整攻略。 什么是FastDFS? FastDFS是用于分布式文件存储的开源软件,支持文件上传、下载以及文件元数据的管理等操作。它采用了分布式的架构设计,可以实现高可用、高性能的文件存储。 准备工作 创建一个Maven项目。 在项目的pom.xml文件中添加FastDFS客户端的依赖。 &lt…

    Java 2023年6月15日
    00
  • Java 网络编程 —— ServerSocket 详解

    构造 ServerSocket ServerSocket 的构造方法有以下几种重载形式 ServerSocket() throws IOException ServerSocket(int port) throws IOException ServerSocket(int port, int backlog) throws IOException Serve…

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