首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么TimerTask不能重用到另一个计时器中,但是已经使用的TimerTask可以重用到ScheduledExecutorService中

TimerTask是Java中用于定时执行任务的类,而ScheduledExecutorService也是Java中用于定时执行任务的接口。虽然它们都可以用于定时执行任务,但是TimerTask不能重用到另一个计时器中,而已经使用的TimerTask可以重用到ScheduledExecutorService中的原因如下:

  1. 实现方式不同:TimerTask是基于Timer类实现的,而ScheduledExecutorService是基于线程池实现的。
  2. 线程安全性:TimerTask是非线程安全的,如果尝试将一个TimerTask对象添加到另一个计时器中,可能会导致并发问题和不可预测的行为。而ScheduledExecutorService是线程安全的,可以安全地将已经使用的任务对象重用到不同的ScheduledExecutorService中。
  3. 取消和异常处理:TimerTask的取消和异常处理机制相对较弱,一旦TimerTask抛出异常,整个Timer都会终止。而ScheduledExecutorService提供了更强大的取消和异常处理机制,可以更好地控制任务的执行。

综上所述,虽然TimerTask和ScheduledExecutorService都可以用于定时执行任务,但是由于实现方式、线程安全性和取消异常处理机制的差异,TimerTask不能重用到另一个计时器中,但是已经使用的TimerTask可以重用到ScheduledExecutorService中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java定时任务

在java中一个完整定时任务需要由Timer、TimerTask两个类来配合完成。 API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。...Timer类 在工具类Timer中,提供了四个构造方法,每个构造方法都启动了计时器线程,同时Timer类可以保证多个线程可以共享单个Timer对象而无需进行外部同步,所以Timer类是线程安全的。...但是由于每一个Timer对象对应的是单个后台线程,用于顺序执行所有的计时器任务,一般情况下我们的线程任务执行所消耗的时间应该非常短,但是由于特殊情况导致某个定时器任务执行的时间太长,那么他就会“独占”计时器的任务执行线程...Timer的缺陷 Timer的缺陷 Timer计时器可以定时(指定时间执行任务)、延迟(延迟5秒执行任务)、周期性地执行任务(每隔个1秒执行任务),但是,Timer存在一些缺陷。...同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。

2K20

定时任务最简单的3种实现方法(超好用)

TOP 1:Timer Timer 是 JDK 自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,所以 Timer 的优点就是使用方便,它的实现代码如下: public class...:Mon Aug 17 21:44:23 CST 2020 从上述结果中可以看出,当任务 1 运行时间超过设定的间隔时间时,任务 2 也会延迟执行。...TOP 2:ScheduledExecutorService ScheduledExecutorService 也是 JDK 1.5 自带的 API,我们可以使用它来实现定时任务的功能,也就是说 ScheduledExecutorService...,当任务 1 执行时间 5s 超过了执行频率 3s 时,并没有影响任务 2 的正常执行,因此使用 ScheduledExecutorService 可以避免任务执行时间过长对其他任务造成的影响。...TOP 3:Spring Task 如果使用的是 Spring 或 Spring Boot 框架,可以直接使用 Spring Framework 自带的定时任务,使用上面两种定时任务的实现方式,很难实现设定了具体时间的定时任务

5.5K40
  • 定时任务最简单的3种实现方法(Java)

    TOP 1:Timer Timer 是 JDK 自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,所以 Timer 的优点就是使用方便,它的实现代码如下: public class...:Mon Aug 17 21:44:23 CST 2020 从上述结果中可以看出,当任务 1 运行时间超过设定的间隔时间时,任务 2 也会延迟执行。...TOP 2:ScheduledExecutorService ScheduledExecutorService 也是 JDK 1.5 自带的 API,我们可以使用它来实现定时任务的功能,也就是说 ScheduledExecutorService...,当任务 1 执行时间 5s 超过了执行频率 3s 时,并没有影响任务 2 的正常执行,因此使用 ScheduledExecutorService 可以避免任务执行时间过长对其他任务造成的影响。...TOP 3:Spring Task 如果使用的是 Spring 或 Spring Boot 框架,可以直接使用 Spring Framework 自带的定时任务,使用上面两种定时任务的实现方式,很难实现设定了具体时间的定时任务

    81350

    界面无小事(四):来写个滚动选择器吧!

    当然了, 滚动选时间也土爆了(手动尴尬), 但是比win的操作方式已经有趣不少了. 而且滚动选择器我觉得还是有很多不错的应用场景的, 所以这次就写一个分享给大家....所以, 我们需要自己设置最小最大字号, 最小最大透明度, 这样就可以在范围内依据函数曲线变化. 差不多就是下图, 但是y是大于0的....计时器是经常用到的, Android里面会用Timer, TimerTask, Handler三个组合使用....思路就是Timer实例使用schedule函数, 传入TimerTask实例以及时间参数. 然后在TimerTask实例的run方法中让Handler实例调用sendMessage方法发送消息....如果对自定义视图不熟悉的, 可以看看我之前的文章. 或者google一下. 要点就是抬手时候开启计时器, 点下记录位置, 移动重绘.

    59820

    Java并发学习之定时任务的几种玩法

    Java中创建和玩转定时任务 定时任务,在日常工作中,可以说是一个算是一个常见的需求场景,比如定时数据校验,数据报表输出,报警等 0....Timer&TimerTask 实现方式 使用Timer,需要借助TimerTask类,在其中书写定时任务的逻辑,因为case中有一个每隔一天跑一次的定时任务和一个延迟任务,所以这里用到了Timer的两种定时任务使用方式...;但是希望在指定的时间进行执行时,依然还是得计算初始的延迟时间,和sleep使用方式中差不多 上面三中,是jdk本身就支持的定时任务的支持;总得来说,能实现你的需求场景,但是不好用,还得让自己去计算delayTime.../sleepTime;讲道理,这对使用者而言,实在是不能更不友好了; 但是在另一方面,若延迟时间比较容易确认的话;或者单纯的使用每隔多长时间调度一次的话,Timer和ScheduledExecutorService...使用小建议 不推荐使用 Thread#sleep的方式做定时任务 如指向利用jdk实现定时任务,可以考虑 Timer 和 ScheduledExecutorService 如项目本身就利用到了Spring

    1.7K100

    Java中定时任务的6种实现方式,你知道几种?

    cancal(); // 从此计时器的任务队列中移除所有已取消的任务。 purge(); 使用示例 下面用几个示例演示一下核心方法的使用。...Timer的缺陷 Timer计时器可以定时(指定时间执行任务)、延迟(延迟5秒执行任务)、周期性地执行任务(每隔个1秒执行任务)。但是,Timer存在一些缺陷。...同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。...ScheduledExecutorService中定义的这四个接口方法和Timer中对应的方法几乎一样,只不过Timer的scheduled方法需要在外部传入一个TimerTask的抽象任务。...Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。

    2.7K30

    Java中的Timer和TimerTask的使用

    Timer定时器实例有多种构造方法:   Timer()   创建一个新计时器。   Timer(boolean isDaemon)   创建一个新计时器,可以指定其相关的线程作为守护程序运行。   ...scheduleAtFixedRate方法设置,可以使run方法体中的代码重复执行,也就是重复执行定时任务,相当于在线程的run方法体中使用一个无穷循环。   ...Timer和TimerTask的使用(二) 该类YourTimerTask 是一个定时任务类,可以实例化多个定时任务的实例。   ...Timer类的cancel方法终止该定时器,调用purge方法重该定时器队列中移除所有已经取消的定时任务。   ...更多的可以参考帮助文档:   void cancel()   终止此计时器,丢弃所有当前已安排的任务。   int purge()   从此计时器的任务队列中移除所有已取消的任务。

    94210

    Java中的定时任务

    Java 系统中主要有三种方式来实现定时任务: Timer和TimerTask ScheduledExecutorService 三方框架 Quartz 下面我们一个个来看。...Timer和TimerTask 先看一个小 demo,接着我们再来分析其中原理: ? 这种方式的定时任务主要用到两个类,Timer 和 TimerTask。...那么,使用上很简单,两个步骤即可,但是其中的实现逻辑是怎样的呢? Timer 接口 首先,Timer 接口中,这两个字段是非常核心重要的: ?...整个方法的逻辑我们可以总结概括一下,具体的代码就不一行行分析了,因为也不难。 首先使用任务队列的内置对象锁,锁住个队列。...ScheduledExecutorService中定义的这四个接口方法和 Timer 中对应的方法几乎一样,只不过 Timer 的 scheduled 方法需要在外部传入一个 TimerTask 的抽象任务

    1.8K20

    使用ScheduledExecutorService代替下Timer

    TimerTask假设抛出异常,那么Timer唯一的进程就会挂掉,这样挂在Timer下的全部任务都会无法继续运行 * * 为了弥补Timer的缺陷,jdk1.5中引入了并发包。...同一时候在线程中对异常进行了捕获。所以是Timer的完美替换者。...TimerTask假设抛出异常,那么Timer唯一的进程就会挂掉,这样挂在Timer下的全部任务都会无法继续运行 为了弥补Timer的缺陷,jdk1.5中引入了并发包。...为什么需要代替Timer: case1、Timer管理延时任务的缺陷    TimerThread是Thread的子类,可以看出内部只有一个线程    符合我们的预期结果。...是Thread的子类,可以看出内部只有一个线程 * 定义了两个任务,预计是第一个任务1s后执行,第二个任务3s后执行,但是看运行结果: * task1 invoked !

    9810

    Java 定时任务

    项目中肯定会用到使用定时任务的情况,笔者就需要定时去拉取埋点数据 使用定时任务的情况: 每周末凌晨备份数据 触发条件 5 分钟后发送邮件通知 30 分钟未支付取消订单 每 1 小时去拉取数据 ........Thread实现 笔试中首次遇到定时任务急急忙忙想出来的方法 2.1 使用 public class ThreadSchedule { public static void main(String...ScheduledExecutorService java.util.concurrent中的工具类,是一个多线程的定时器 4.1 使用 public class ExecutorSchedule {...执行器就是定时任务,而调度中心则负责管理调用这些定时任务,调度中心也可以存储定时任务通过脚本形式(Java 是 Grovvy)免编译地实时下发到各服务中执行。...界面简单方便使用,而且对代码没什么侵入性,已经能满足大部分项目的需求了,笔者如果要用定时任务也会首选 xxl-job

    2.9K30

    Java Timer 定时任务实现原理及缺陷分析

    execute time:2017-10-16 23:02:48 从结果来看,task1 每次执行的时间间隔为3秒钟,task2每次执行的时间间隔也为3秒钟。 为什么会这样呢?...Timer 中维护了一个TaskQueue队列,存放TimerTask任务 Timer 定义了一个线程,用于执行轮询队列中的Task任务,并执行。 TaskQueue结构 ?...即将要执行的任务永远存放到TimerTask[1] 中,(数组中的任务顺序,是不断的调整的,每次获取完任务后都会调整一次)。...ScheduledExecutorService 代替 Timer 基于上述Timer的两个致命缺陷,在以后的开发中尽可能使用ScheduledExecutorService(JDK1.5以后)替代Timer...ScheduledExecutorService是基于线程池的,可以开启多个线程进行执行多个任务,每个任务开启一个线程,这样就可以避免上述的两个致命缺陷。

    1.3K80

    5分钟搞定,实现 定时任务 的五种方案!

    我们在实际开发中,多多少少都会用到定时任务来处理一些问题。 比如金融项目中的对账,每天定时对昨天的账务进行核对,每个月初对上个月的账务进行核对等。...学习资料的:0 基础 Java 自学之路(配套教程) 常规实现方案 方案1:Timer 这个目前在项目中用得较少,直接贴demo代码。 具体的介绍可以查看api ,但是在某些框架中是有用到。...: 从提示中可以看出,在多线程并行处理定时任务时,Timer运行多个TimerTask时,只要有其中之一没有捕获抛出的异常,其他任务会自动终止运行。...quartz 定时任务 这是我的 quartz 定时任务 这是我的 quartz 定时任务 其他方案 我们在项目,可能会涉及动态调整定时任务执行core表达式、动态关闭开启定时任务,我们可以使用SchedulingConfigurer...但是资源有限,必须对资源进行控制,首先就是限制服务线程的最大数目,其次考虑以线程池共享服务的线程资源,降低频繁创建、销毁线程的消耗;然后任务调度信息的存储包括运行次数、调度规则以及运行数据等。

    61260

    JAVA实现定时器功能

    在接口开发时,有一种开发模式叫定时器模式,可以理解为每经过一段预设的时间就会执行一次事件,而在我们的工作中,这个事件所实现的功能一般是将两个系统的数据信息进行同步,这样就实现了两个系统通过接口进行对接的功能...Timer类 在工具类Timer中,提供了四个构造方法,每个构造方法都启动了计时器线程,同时Timer类可以保证多个线程可以共享单个Timer对象而无需进行外部同步,所以Timer类是线程安全的。...但是由于每一个Timer对象对应的是单个后台线程,用于顺序执行所有的计时器任务,一般情况下我们的线程任务执行所消耗的时间应该非常短,但是由于特殊情况导致某个定时器任务执行的时间太长,那么他就会“独占”计时器的任务执行线程...Timer的缺陷 Timer计时器可以定时(指定时间执行任务)、延迟(延迟5秒执行任务)、周期性地执行任务(每隔个1秒执行任务),但是,Timer存在一些缺陷。...同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。

    1.1K10

    (80) 定时任务的那些坑 计算机程序的思维逻辑

    在Java中,有两种方式实现定时任务: 使用java.util包中的Timer和TimerTask 使用Java并发包中的ScheduledExecutorService 它们的基本用法都是比较简单的...死循环 一个Timer对象只有一个Timer线程,这意味着,定时任务不能耗时太长,更不能是无限循环,看个例子: public class EndlessLoopTimer { static class...小结 可以看到,Timer/TimerTask的基本使用是比较简单的,但我们需要注意: 背后只有一个线程在运行 固定频率的任务被延迟后,可能会立即执行多次,将次数补够 固定延时任务的延时相对的是任务执行前的时间...不要在定时任务中使用无限循环 一个定时任务的未处理异常会导致所有定时任务被取消 ScheduledExecutorService 接口和类定义 由于Timer/TimerTask的一些问题...小结 本节介绍了Java中定时任务的两种实现方式,Timer和ScheduledExecutorService,需要特别注意Timer的一些陷阱,实践中建议使用ScheduledExecutorService

    1.2K90

    定时任务常见实现方式

    其中Timer是一种工具,线程用其安排在后台线程中执行的任务,可安排任务执行一次或者定期重复执行;而TimerTask是由Timer安排执行一次或者重复执行的任务。...线程是不会捕获异常的,如果TimerTask抛出未检查的异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,它会错误的认为整个Timer线程都会取消,已经被安排但尚未执行的TimerTask...使用ScheduledExecutorService优化: ? 运行结果为: ? 2.Timer的第二个缺陷 ? 运行结果为: ? 可以看到,timerOne抛出异常,而timerTwo并没有执行。...3.ScheduledExecutorService小结 可以看到针对Timer类存在的两个缺陷,ScheduledExecutorService可以很好地解决,其思路主要在于每一个被调度的任务都是由线程池中的一个线程去执行...无特定值,通常和其他指定的值一起使用,表示必须显示该值但不能检查 - 范围 , 列分隔符,可以指定一系列的值 / 增量,表示一个值的增量 L 表示Last,在日期和星期域中表示有所不同。

    1.3K20

    Timer和TimerTask详解

    Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。...purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。...Timer主要有两个数据结构,一个是使用最小堆数据结构实现的队列,另一个是调度任务执行的线程 2. 线程执行逻辑是一个死循环 a....在使用Timer时注意TimerTask里面函数的异常捕捉,出现异常危害很大 2. Timer不能保证TimerTask按照指定的时间执行… 3....如果我们想让这个程序正好在3秒以后终止,无论哪一个beep因为什么原因被延时,那么我们需要使用 scheduleAtFixedRate方法,这样当第一个beep迟到时,那么后面的beep就会以最快的速度紧密执行

    1.1K20

    定时器有几种实现方式?

    ,工作效率,数据结构…简单上手使用一个框架,并不能体现出个人的水平,如何与他人构成区分度?...接着再聊聊第一个话题:探讨一些优秀的定时器实现方案。 2 理解定时器 很多场景会用到定时器,例如 使用 TCP 长连接时,客户端需要定时向服务端发送心跳请求。 财务系统每个月的月末定时生成对账单。...,按照 expireTime 查找合适的位置即可;Cancel O(1) ,任务在 Cancel 时,会持有自己节点的引用,所以不需要查找其在链表中所在的位置,即可实现当前节点的删除,这也是为什么我们使用双向链表而不是普通链表的原因是...其中 Timer 负责设定 TimerTask的起始与间隔执行时间。使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。...,前面我们已经介绍过了堆这个数据结构的特点。

    4.6K30

    学会这10种定时任务,我有点飘了

    当然你也可以把后面的执行java程序的命令写成shell脚本,更方便维护。 使用这种定时任务支持方便修改定时规则,有界面可以统一管理配置的各种定时脚本。...方法,在该方法中实例化TimerTask类,业务逻辑写在run方法中。...并且如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行,所以阿里巴巴开发者规范中不建议使用它。...假设前期工作已经OK了,接下来我们需要: 第一步,在pom.xml文件中引入xxl-job相关依赖。...主要特点如下: 分布式调度协调 弹性扩容缩容 失效转移 错过执行作业重触发 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例 自诊断并修复分布式不稳定造成的问题 支持并行调度 整体架构图: image.png

    3K11
    领券