java定时器Timer的使用

2023-11-15

在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务,Timer类的主要作用就是设置计划任务,但是封装任务的类的是TimerTask类。

下面展示几个例子。

在指定的日期执行一次某一任务:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Main {
    static Timer timer = new Timer();
    static public class MyTask extends TimerTask{
        @Override
        public void  run(){
            System.out.println("start!");
        }
    }
    public static void main(String[] args) {
        MyTask task = new MyTask();
        try {
            timer.schedule(task, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-25 23:33:20"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

到了指定的时间2019-12-25 23:33:20会自动执行,如果计划时间早于当前时间,则马上执行任务。

但是,程序并没有停止, 新启动的线程不是守护线程,改成守护线程:

static Timer timer = new Timer(true);

如果存在多个定时器的场景,顺序执行,则会发生以下状况。

timer.schedule(task1, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-25 23:33:20"));

timer.schedule(task2, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-25 23:33:21"));

task1执行的时间为20s,那么task2执行的时间是在20S之后,而不是指定的23:33:21

方法public void schedule(TimerTask task, long delay, long period)

在指定的日期之后,按指定的间隔period,每隔period毫秒就会周期性得执行某一任务。如果每次执行task的时间大于period,那么,执行完一次task就会马上执行下一次,不会等待period。

方法cancel()

在task执行的逻辑里面,如果执行了cance()l,那么这个定时任务不会再周期性的执行task。

在TimerTask中执行this.cancel();,那么这个task不会再周期性地执行。

static Timer timer = new Timer();
static public class MyTask extends TimerTask{
    @Override
    public void  run(){
        System.out.println("start!");
        this.cancel();
    }
}

在run方法中执行tiemr.cancel();

public void  run(){
        System.out.println("start!");
        tiemr.cancel();    
}

timer.cancel会把所有任务都清除。

 

ScheduleAtFixedRate(TimerTask task, Date firstTime, long period)

方法顺序执行,ScheduleAtFixedRate和schedule方法主要区别在于不延迟的情况。

使用schedule方法,如果执行任务没有被延时,那么下一次执行任务的执行时间参考的是上次任务开始的时间。

使用ScheduleAtFixedRate方法,使用的是上次任务结束的时间计算。

public class Main {
    static Timer timer = new Timer();
    static public class MyTask extends TimerTask{
        @Override
        public void  run(){
            System.out.println("start! " + new Date());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("end! " + new Date());
        }
    }
    public static void main(String[] args) {
        MyTask task = new MyTask();
        try {
            timer.scheduleAtFixedRate(task, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-1-1 23:34:20"),3000);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

 

如果指定的时间早于当前时间,那么执行结果是上一次结束的时间:

如果指定的时间晚于当前时间,那么就是3s执行一次

 

Schedule不具有追赶时间,如果指定时间早于当前时间,那么中间时间不会被执行。

而scheduleAtFixedRate会补充性执行中间的时间。执行时间间隔为2s

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java定时器Timer的使用 的相关文章

  • 【数据库原理选择题1-4章】

    1 1 数据库系统概述 1 1 DB DBMS 和DBS 三者之间的关系是 A DBMS包括DB和DBS B DB 包括DBMS和DBS C 不能相互包括 D DBS包括DB和DBMS 正确答案 D 2 位于用户和操作系统之间的一层数据管理

随机推荐

  • VS2017 登录账户时,反复让输入密码,而一直无法登陆。

    问题描述 VS2017 登录账户时 反复让输入密码 而一直无法登陆成功 最后显示无法刷新此账户凭据 解决办法 在排除是自己账户或者网络有问题后 通过清理用户数据解决问题 具体步骤如下 使用管理员权限打开命令终端 转到VS安装目录下的 Com
  • torch中的model.eval()、model.train()详解

    个人简介 深度学习图像领域工作者 工作总结链接 https blog csdn net qq 28949847 article details 128552785 链接中主要是个人工作的总结 每个链接都是一些常用demo 代码直接复制运行即
  • 欧几里得距离(欧式距离)

    文章目录 一 定义 二 公式 一 定义 欧几里得度量 欧氏距离 Euclidean Metric Euclidean Distance 指在m维空间中两个点之间的真实距离 或者向量的自然长度 即该点到原点的距离 比如 在二维和三维空间中的欧
  • 液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

    关注 M r m a t e r i a l color Violet rm Mr material Mr material
  • FDR计算

    FDR计算 FDR的计算很简单 我折腾了一上午主要是因为遇到了以下几个问题 问题 FDR是什么 有什么用 怎么计算 我把几个模型的P值都合并成一个表了 所以每次运算FDR时 我需挑选特定的对象 我有多个模型 所以我想着要如何构建循环 FDR
  • 机器学习-人为设置函数方法和神经网络方法解决智能五子棋问题

    2 智能决策 2 1 博弈树模型算法 2 1 1 全局估算函数 此次项目中评估函数有两种 1 人为设定函数方法 更具人的经验 对一些特定的棋形在棋盘上进行检索 并且计数 最后赋予相应权值求和得到对棋盘的评价值 典型的棋形有 活一 活二 活三
  • 集成学习-理论概述

    1 集成学习概述 集成学习 ensemble learning 本身不是一个单独的机器学习算法 而是通过构建并结合多个机器学习器来完成学习任务 集成学习的特点 集成方法是一种将几种机器学习技术组合成一个预测模型的元算法 以减小方差 bagg
  • IDEA中如何导入module并成功运行

    在写Java项目的时候我们通常需要导入module 需要注意的是导入过程需要以下两大步骤 否则会出现无法运行的情况 以下我以导入 service edu 模块为例 一 将module文件拷贝到工程目录下 直接将需要导入的module文件 s
  • 李宏毅深度学习——优化方法

    记录了关于梯度的历史 SGD SGD with Momentum 防止gradient为0 SGD停止不动了 sgd with momentum 前面的移动会累加到下一步 sgd with momentum 前面的移动会累加到下一步 所以小
  • 【07节】Python3+Selenium4自动化 unittest 测试框架详解

    文章目录 1 unittest 框架介绍 2 创建单元测试步骤 3 unittest 模块介绍 3 1 TestCase 类 3 1 1 TestCase 类常用方法 3 1 2 TestCase 类其他方法 3 2 setUp 与 tea
  • 【cpu or gpu】【tensorflow】怎么查看用的是CPU还是GPU

    方法1 from tensorflow python client import device lib print device lib list local devices 参考博客 可用设备为 name device CPU 0 dev
  • 设计模式之桥接模式

    文章目录 一 手机操作问题 1 传统方案解决手机操作问题 2 传统方案解决手机操作问题分析 二 桥接模式 1 基本介绍 2 原理类图 三 桥接模式解决手机操作的问题 1 类图 2 代码 2 抽象类 抽象类子类 行为类接口 接口实现类 客户端
  • 关于api-ms-win-crt-runtimel1-1-0.dll缺失问题的解决方法

    1 问题描述 在win7系统中安装一个截图软件Snipaste时 出现api ms win crt runtimel1 1 0 dll缺失问题 如下图 2 问题原因 在网上查找资料 发现说是在C window system 或者C wind
  • 八十六.快速排序与归并排序(查找与排序(二))——JAVA

    查找与排序 一 查找与排序 三 查找与排序 四 一 分治法 分治法 将原问题划分成若干个规模较小而结构与原问题一致的子问题 递归地解决这些子问题 然后再合并其结果 就得到原问题的解 容易确定运行时间 是分支算法的优点之一 分治模式在每一层递
  • UE TSubclassOf

    定义 TSubclassOf
  • opencv中Mat矩阵的合并与拼接

    opencv如何将两个矩阵按行或者按列合并 在Matlab中将两个矩阵合并非常方便 按行合并 如A B C 按列合并如A B C 其实opencv有自带函数 vconcat和hconcat函数 用于矩阵的合并与图像的拼接 vconcat B
  • React中获取元素(ref获取方式)

    受控组件 在react中 input标签的部分属性受到react控制 如onChange是基于input 和change 事件进行封装 非受控组件 对于没有经历过封装的一些属性或者方法 可以通过ref去获取这个dom元素 再去获取或触发其自
  • 快速学会linux上的chrony服务

    文章目录 chrony服务 1 安装与配置 2 同步网络时间服务器 3 配置时间服务器 将本机作为服务器 4 chronyc命令 5 强制时区 chrony服务 Chrony 是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件 它
  • 智慧井盖监测管理系统解决方案

    一 方案概述 近年来 随着城市化的不断发展 城市地下管道设施的一步步完善 井盖作为城市基础设施中必不可少的一部分 其重要性也逐渐凸显 然而 在实际应用中 井盖监测和管理并不容易 如井盖地理位置分散 数量庞大 传统的巡检方式成本高 效率低 不
  • java定时器Timer的使用

    在JDK库中Timer类主要负责计划任务的功能 也就是在指定的时间开始执行某一个任务 Timer类的主要作用就是设置计划任务 但是封装任务的类的是TimerTask类 下面展示几个例子 在指定的日期执行一次某一任务 import java