Timer使用

1. 基本概念

Timer:一个*定时器工具,用于在后台线程中计划执行指定任务。它可以安排任务执行一次,或者定期重复执行。
TimerTask:一个抽象类,它的子类代表一个可以被Timer计划执行的任务。TimerTask类实现了Runnable接口,因此每一个具体的任务类都必须继承TimerTask,并重写run()方法来定义具体的任务逻辑。

2. 核心方法

Timer类提供了几个核心方法用于安排任务的执行,主要包括:

schedule(TimerTask task, Date time):在指定的时间执行一次任务。
schedule(TimerTask task, long delay):在指定的延迟时间后执行一次任务。
schedule(TimerTask task, long delay, long period):在指定的延迟时间后开始执行任务,并按照给定的时间间隔重复执行。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period):在指定的时间开始执行任务,并按照给定的时间间隔重复执行,但是不考虑任务的执行时间。
scheduleAtFixedRate(TimerTask task, long delay, long period):在指定的延迟时间后开始执行任务,并按照给定的时间间隔重复执行,但是不考虑任务的执行时间。

3. 工作原理

Timer内部包含了一个任务队列(TaskQueue)和一个任务调度线程(TimerThread)。任务队列用于存储待执行的任务,任务调度线程则负责从队列中取出任务并执行。

当调用Timer的schedule方法时,实际上是将一个TimerTask对象放入了任务队列中,并设置了该任务的执行时间。任务调度线程会不断地检查任务队列,如果发现有任务的执行时间已到,就会从队列中取出该任务并执行。

4. 注意事项

Timer是单线程的,即所有的任务都是由同一个线程来执行的。如果某个任务的执行时间过长,可能会影响其他任务的执行。
如果在执行任务时抛出了未检查的异常,那么Timer线程将会终止,后续的任务将不会被执行。因此,建议在任务中处理好可能抛出的异常。
Java 5及之后的版本中,推荐使用ScheduledExecutorService接口提供的定时任务调度功能,它支持多线程执行任务,更加灵活和可靠。

在这里插入图片描述

演示:

import java.util.Timer;
import java.util.TimerTask;

public class M {
    public static void main(String[] args) {
       Timer timer=new Timer();
        TimerTask taske1=new TimerTask() {
            @Override
            public void run() {
                System.out.println("task1");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        TimerTask taske2 =new TimerTask() {
            @Override
            public void run() {
                System.out.println("task2");

            }
        };
       //但由于 timer 内只有一个线程来顺序执行队列中的任务,因此『任务1』的延时,影响了『任务2』的执行
        timer.schedule(taske1,1000);
        timer.schedule(taske2,1000);
    }
}

相关推荐

  1. python-time模块使用

    2024-07-19 18:22:03       53 阅读
  2. golang time.Newtimer和time.NewTicker使用和不同

    2024-07-19 18:22:03       55 阅读
  3. 【Delphi 基础知识 31】Timer控件的详细使用

    2024-07-19 18:22:03       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 18:22:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 18:22:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 18:22:03       58 阅读
  4. Python语言-面向对象

    2024-07-19 18:22:03       69 阅读

热门阅读

  1. go exporter开发 第一篇

    2024-07-19 18:22:03       17 阅读
  2. ubuntu23安装tensorRT步骤记录

    2024-07-19 18:22:03       18 阅读
  3. Unable to connect to Redis] with root cause

    2024-07-19 18:22:03       18 阅读
  4. redis时间环结构-时序特征

    2024-07-19 18:22:03       19 阅读
  5. 欢迎来到 Mint Expedition:Web3 和 NFT 的新时代开始

    2024-07-19 18:22:03       23 阅读
  6. MySQL运算符

    2024-07-19 18:22:03       22 阅读
  7. 【gradle中如何不使用插件将依赖打进jar包】

    2024-07-19 18:22:03       18 阅读
  8. web前端面向对象面试25题

    2024-07-19 18:22:03       18 阅读
  9. 【编程语言】C++和C的异同点

    2024-07-19 18:22:03       20 阅读
  10. 【React Hooks原理 - useSyncExternalStore】

    2024-07-19 18:22:03       14 阅读