java中的Timer和Timertask的关系解读

 更新时间:2024年12月23日 17:17:00   作者:健康平安的活着  
本文详细介绍了Java中的Timer和TimerTask类,包括它们之间的关系、API的使用方法、注意事项以及操作案例,Timer是一个调度器,而TimerTask是具体的任务类,Timer仅对应一个线程,不保证任务执行的精确性,但线程安全,一个Timer可以调度多个TimerTask

一 time和timertask的关系

1.1 timer和timertask关系

1.Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类;

2.Timer和TimerTask成对出现,Timer是定时器,TimerTask是定时任务。换句话说,定时任务TimerTask是给定时器Timer执行的具体任务。TimerTask实现Runnable接口的run方法。

Java的定时器Timer和定时任务TimerTask应用以及原理

3.每一个Timer仅对应唯一一个线程。Timer不保证任务执行的十分精确。Timer类的线程安全的。

4.一个Timer可以调度任意多个TimerTask,所有任务都存储在一个队列中顺序执行,如果需要多个TimerTask并发执行,则需要创建两个多个Timer。

一个Timer可以执行多个TimerTask,但一个TimerTask只能被一个Timer使用(这和schedule中校验TimerTask的状态有关,TimerTask的生命周期(由不同的状态确定))。

简单的说Timer中有两个核心部分:

TimerThread是时间线程,控制TaskQueue中TimerTask的执行;

TaskQueue是一个工具类,管理TimerTask数组

1.2 timer的api

无参构造方法,简单通过Tiemer为前缀构造一个线程名称

有参构造方法,传入了是否为后台线程,后台线程当且仅当进程结束时,自动注销掉。

1.3 终止Timer线程

默认情况下,创建的timer线程会一直执行,主要有下面四种方式来终止timer线程:

1) 调用Timer.cancle()方法。可以在程序任何地方调用,甚至在TimerTask中的run方法中调用;

2) 创建Timer时定义位daemon守护线程,使用new Timer(true)语句;

3) 设置Timer对象为null,其会自动终止;????有待考证

4) 调用System.exit方法,整个程序终止。

1.4 timer注意事项

1) Timer线程不会捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。如果Timer线程中存在多个计划任务,其中一个计划任务抛出未检查的异常,则会引起整个Timer线程结束,从而导致其他计划任务无法得到继续执行。  

2) Timer线程时基于绝对时间(如:2023/02/14 16:06:00),因此计划任务对系统的时间的改变是敏感的。

3) Timer是单线程,如果某个任务很耗时,可能会影响其他计划任务的执行。

因此,JDK1.5以上建议使用ScheduledThreadPoolExecutor来代替Timer执行计划任务。

二 操作案例

2.1 一个Timer执行多个Task,堵塞现象

package com.ljf.lockdemo.task.timerdemo;

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

/**
 * @ClassName: TestDemo2
 * @Description: TODO
 * @Author: admin
 * @Date: 2024/03/02 11:30:06 
 * @Version: V1.0
 **/
public class TestDemo2 {
    public static void main(String[] args) {
        TimerTask task1=new TimerTask() {
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                System.out.println("[当前线程是:"+name+",执行定时任务1:"+System.currentTimeMillis()+"]");
            }
        };

        TimerTask task2=new TimerTask() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String name = Thread.currentThread().getName();
                System.out.println("[当前线程是:"+name+",执行定时任务2:"+System.currentTimeMillis()+"]");
            }
        };


        Timer timer=new Timer();
        timer.schedule(task2,10000);
        timer.schedule(task1,100,3000);

    }
}

结果:

2.2 异常现象

现象操作,在timetask2中,模拟一个除以0的算术异常。

强调:在执行任何一个任务的run方法时,一旦run抛出了异常,Timer线程就会退出,从而所有定时任务都会被取消。如果希望各个定时任务互不干扰,一定要在run方法内捕获所有异常。

这里catch的异常为:integerrupteException

改成Exceptione 如图

启动两个timer

总结

1个timer没有cancel掉,使用的一直是一个线程id;1个timer关闭后,再每次new后,使用的线程id都不相同。

在1个timer中,开启两个timetask;这个两个timertask串行执行,单线程;使用的线程id是相同的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决mybatis中order by排序无效问题

    解决mybatis中order by排序无效问题

    这篇文章主要介绍了解决mybatis中order by排序无效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java实现猜字小游戏

    Java实现猜字小游戏

    这篇文章给大家分享小编随手写的猜字小游戏,基于java代码写的,感兴趣的朋友跟随小编一起看看吧
    2019-11-11
  • IDEA入门级使用教程你居然还在用eclipse?

    IDEA入门级使用教程你居然还在用eclipse?

    上个月,idea的使用量超越eclipse的消息席卷了整个IT界,idea到底好在哪里呢?下面小编通过本文给大家详细介绍下IDEA入门级使用教程,非常详细,感兴趣的朋友一起看看吧
    2020-10-10
  • Java中bcrypt算法实现密码加密的方法步骤

    Java中bcrypt算法实现密码加密的方法步骤

    我们可以在Spring Boot和SSM中实现密码加密,使用bcrypt算法可以保障密码的安全性,并且减少了手动编写哈希函数的工作量,本文就来详细的介绍一下,感兴趣的可以了解一下
    2023-08-08
  • Java中Map集合中的Entry对象用法

    Java中Map集合中的Entry对象用法

    这篇文章主要介绍了Java中Map集合中的Entry对象用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java JDK 二分法 分析demo(推荐)

    Java JDK 二分法 分析demo(推荐)

    下面小编就为大家带来一篇Java JDK 二分法 分析demo(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • java操作Apache druid的实例代码

    java操作Apache druid的实例代码

    这篇文章主要介绍了java操作Apache druid的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Maven build 命令介绍的使用详解

    Maven build 命令介绍的使用详解

    这篇文章主要介绍了Maven build 命令介绍的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java AES256加密解密示例代码

    Java AES256加密解密示例代码

    这篇文章主要介绍了Java AES256加密解密示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java高级用法中的JNA类型映射注意细节及使用问题

    Java高级用法中的JNA类型映射注意细节及使用问题

    本文介绍了在使用JNA方法映射中应该注意的一些细节和具体的使用问题,对java  JNA类型映射注意细节感兴趣的朋友一起看看吧
    2022-04-04

最新评论