java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。
但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,
由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。
Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。
这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。
此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。
ScheduledExecutorService扩展了ExecutorService接口,提供时间排程的功能。
schedule(Callable<V> callable, long delay, TimeUnit unit) 创建并执行在给定延迟后启用的 ScheduledFuture。 |
schedule(Runnable command, long delay, TimeUnit unit) 创建并执行在给定延迟后启用的一次性操作。 |
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnitunit) 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。 |
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay,TimeUnit unit) 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
|
schedule方法被用来延迟指定时间来执行某个指定任务。如果你需要周期性重复执行定时任务可以使用scheduleAtFixedRate或者scheduleWithFixedDelay方法,它们不同的是前者以固定频率执行,后者以相对固定频率执行。
不管任务执行耗时是否大于间隔时间,scheduleAtFixedRate和scheduleWithFixedDelay都不会导致同一个任务并发地被执行。唯一不同的是scheduleWithFixedDelay是当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。
ScheduledExecutorService的实现类,是ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor对象包含的线程数量是没有可伸缩性的,只会有固定数量的线程。不过你可以通过其构造函数来设定线程的优先级,来降低定时任务线程的系统占用。
特别提示:通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么过ScheduledExecutorService就会停止执行任务,且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行,那么catch一切可能的异常。
原文地址:http://blog.sina.com.cn/s/blog_69c5534d01010ei3.html
相关推荐
在本文中,我们将深入探讨`Timer`类的基本使用和示例,帮助你理解如何在Java程序中实现简单的定时任务。 首先,`Timer`类提供了计划任务的能力,它可以按照预定的时间间隔安排任务执行。创建一个`Timer`对象后,你...
本篇文章将深入探讨如何使用Timer和TimerTask来实现简单的定时任务。 首先,`java.util.Timer`是一个线程类,它维护了一个调度队列,用于存储将要执行的任务。当我们创建一个Timer对象时,实际上启动了一个后台线程...
它创建了一个后台线程,用于处理定时任务。通过调用`Timer`类的构造函数,我们可以创建一个定时器实例: ```java Timer timer = new Timer(); ``` 然后,我们需要定义一个`TimerTask`子类,覆盖其`run`方法,以...
在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...
Java 定时任务是指在 Java 语言中实现的定时执行任务的机制,通过使用 Timer 和 TimerTask 两个类,可以实现定时执行任务的功能。在这个例子中,我们将实现每天定时执行任务的功能,具体来说,就是在每天的凌晨 2 点...
创建自定义定时任务的关键在于设计一个任务调度器,它可以存储和管理多个定时任务。这个调度器应该包含以下功能: 1. **任务注册**:允许用户注册新的定时任务,提供任务的执行间隔、任务函数等信息。 2. **任务...
在IT行业中,定时任务是许多Web应用程序不可或缺的一部分,它们允许开发者按照预定的时间间隔执行特定的任务,比如数据备份、清理...理解和掌握这些内容,能够帮助开发者有效地构建和维护具有定时任务功能的Web应用。
在Java编程语言中,`Timer`类和Spring框架的定时任务是两种常见的实现定时执行任务的方式。本篇文章将深入探讨这两个主题,旨在帮助初学者理解它们的工作原理以及如何在实际项目中应用。 首先,让我们来看一下Java...
- 在编写定时任务时,考虑异常处理和日志记录,以便出现问题时能快速定位和修复。 - 频繁执行的任务应尽可能减少对数据库和其他资源的访问,以减轻服务器压力。 通过以上步骤,你便可以在ThinkPHP框架中创建并配置...
在Web应用中,我们可以利用Servlet容器提供的特性来更优雅地处理定时任务,这就是描述中提到的方法。 首先,我们需要在`web.xml`文件中添加一个监听器(listener)。监听器是Servlet规范的一部分,它会在特定的事件...
【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP定时任务】基于thinkphp定时任务计划任务.zip 【PHP...
总结,Spring中使用`Timer`和`TimerTask`来实现精确时间运行的定时任务,虽然比直接使用`@Scheduled`注解稍微复杂一些,但能提供更细粒度的控制。在实际项目中,应根据需求选择合适的方式来实现定时任务。
首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类负责安排在后台线程上的TimerTask任务的执行。TimerTask是一个抽象类,我们需要创建它的一个子类,并重写run方法来...
在Java中,`java.util.Timer` 类提供了创建和管理定时任务的功能。如果需要在特定时间之后执行某个任务,可以利用 `Timer` 类的 `schedule()` 方法。此方法接受一个实现了 `TimerTask` 接口的实例以及一个表示延迟...
本文将深入探讨如何在Tomcat中实现定时任务,主要涉及的知识点包括Java的定时器(Timer)和Spring框架的TaskScheduler。 首先,让我们了解一下Java中的定时任务。在Java标准库中,有一个名为`java.util.Timer`的类...
ASP.NET定时任务是Web开发中常见的一种功能,...以上就是ASP.NET实现定时任务的基本步骤和关键知识点,通过合理的设计和实现,可以构建出高效可靠的定时任务系统。在实际项目中,还需要根据具体需求进行调整和优化。
1. `Global.asax`:这是一个ASP.NET Web应用程序的全局应用程序文件,虽然在WinForm项目中不常见,但可能被用作统一管理定时任务的起点,或者用于全局事件处理。 2. `Default.aspx`:这是ASP.NET Web应用程序的默认...
`Quartz`和`Timer`都是Java中实现定时任务的工具,各有特点和适用场景。 `Timer`是Java标准库中的类,位于`java.util`包下,提供了定时任务的基本功能。`Timer`创建一个后台线程,可以安排单次或周期性的任务执行。...
5. **Hangfire**:这是一个轻量级的后台任务处理框架,支持异步任务和定时任务,非常适合Web应用。它可以方便地集成到ASP.NET项目中,无需关心线程管理。 6. **Azure Functions** 或 **AWS Lambda**:对于云环境,...