概念
Timer是jdk中提供的一个定时器工具,每个Timer都会启动一个线程,用于顺序地执行所有计时器任务,可安排任务执行一次,或者定期重复执行。
TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
特点
每一个Timer仅对应唯一一个线程。
Timer不保证任务执行的十分精确。
Timer类的线程安全的。
Timer构造函数
Timer():创建一个新计时器,其相关的线程不 作为守护程序运行。
Timer(String name):创建一个新计时器,其相关的线程具有指定的名称,相关的线程不 作为守护程序运行。
Timer(booleanisDaemon):如果应该将相关的线程作为守护程序运行,则为 true。
Timer(Stringname, booleanisDaemon):name
- 相关线程的名称。isDaemon
- 如果应该将相关的线程作为守护程序运行,则为 true。
TimerTask类方法
public boolean cancel():
取消此计时器任务。
如果任务安排为一次执行且还未运行,或者尚未安排,则永远不会运行。
如果任务安排为重复执行,则永远不会再运行。
如果发生此调用时任务正在运行,则任务将运行完,但永远不会再运行。
注意,从重复的计时器任务的 run 方法中调用此方法绝对保证计时器任务不会再运行。
此方法可以反复调用;第二次和以后的调用无效。
返回:
如果此任务安排为一次执行且尚未运行,或者此任务安排为重复执行,则返回 true。
如果此任务安排为一次执行且已经运行,或者此任务尚未安排,或者此任务已经取消,则返回 false。
public abstract void run():
此计时器任务要执行的操作。需要我们重写。
public long scheduledExecutionTime():
返回此任务最近实际 的已安排 执行时间,可以理解为计划执行的时间。是毫秒值,值可以参考java.util.Date的gettime()方法的返回值。
终止定时器
使用Timer类的cancel()方法:终止此计时器,丢弃所有当前已安排的任务。这不会干扰当前正在执行的任务(如果存在)。一旦终止了计时器,那么它的执行线程也会终止,并且无法根据它安排更多的任务。
scheduleAtFixedRate和schedule方法的区别
scheduleAtFixedRate与schedule方法的侧重点不同,schedule方法侧重保存间隔时间的稳定,而scheduleAtFixedRate方法更加侧重于保持执行频率的稳定。
在schedule方法中会因为前一个任务的延迟而导致其后面的定时任务延时,因此后一个任务的计划执行时间会根据前一个任务的执行时间加上任务延时时间。而scheduleAtFixedRate方法则不会,如果第n个任务执行时间过长导致当前系统时间>= 第n+1个任务的计划执行时间,则不会做任何等待他会立即执行第n+1个任务。
所以scheduleAtFixedRate方法计划执行时间的计算方法不同于schedule,而是scheduledExecutionTime(n)=firstExecuteTime +n*periodTime,该计算方法永远保持不变。所以scheduleAtFixedRate更加侧重于保持执行频率的稳定。
示例1
schedule(TimerTask task, long delay) :安排在指定延迟后执行指定的任务。
public static void main(String[] args) {
final Timer timer = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("tt:"
+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new Date()));
timer.cancel();
}
};
timer.schedule(tt, 1000);
}
这里直接new一个TimerTask,我们也可以写个类继承TimerTask。1秒后执行任务,执行完成后调用cancel方法终止定时器。
schedule(TimerTask task, long delay, long period) :安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
public static void main(String[] args) {
final Timer timer = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("tt:"
+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new Date()));
}
};
timer.schedule(tt, 1000, 2000);
}
这里我们并没有调用cancel方法,因此,这个定时器会一直执行下去,知道其他的因素导致jvm退出为止。结果如下:首先1秒后执行一次,接下来每隔2秒执行一次。
tt:2015/07/29 13:09:38
tt:2015/07/29 13:09:40
tt:2015/07/29 13:09:42
tt:2015/07/29 13:09:44
tt:2015/07/29 13:09:46
···
</span>
schedule(TimerTask task, Date time):安排在指定的时间执行指定的任务。
用法和上面的例子类似,只是把指定的延迟改为指定的时间。
schedule(TimerTask task, Date firstTime, long period) :安排指定的任务在指定的时间开始进行重复的固定延迟执行。
用法和上面的例子类似,只是把指定的延迟改为指定的时间。
示例2
scheduleAtFixedRate(TimerTask task, Long delay, long period):安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
public static void main(String[] args) {
final Timer timer = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
System.out.println("tt:"
+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new Date()));
try {
// 睡眠3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
timer.scheduleAtFixedRate(tt, 1000, 2000);
}
结果:由于每一个任务后睡眠了3秒,超过了循环执行的间隔时间,因此每次睡眠完就立马执行下一次任务,因此这里变成了3秒执行一次。
tt:2015/07/29 13:25:54
tt:2015/07/29 13:25:57
tt:2015/07/29 13:26:00
tt:2015/07/29 13:26:03
···
scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任务在指定的时间开始进行重复的固定延迟执行。
用法和上面的例子类似,只是把指定的延迟改为指定的时间。
Timer的缺陷
Timer计时器可以定时(指定时间执行任务)、延迟(延迟5秒执行任务)、周期性地执行任务(每隔个1秒执行任务),但是,Timer存在一些缺陷。首先Timer对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。其次Timer线程是不会捕获异常的,如果TimerTask抛出的了未检查异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,他会错误的认为整个Timer线程都会取消。同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
分享到:
相关推荐
在提供的`timerTask.txt`和`timerTask`文件中,可能包含了使用Timer和TimerTask实现的具体示例代码,你可以打开这些文件进一步学习和研究。通过实践和调试,你将更好地理解和掌握Java中的定时任务处理。
同时,提及了Timer和TimerTask,它们用于任务调度,这是java.util的一部分,用于在后台线程中安排任务执行。另外,还提到了异常类EmptyStackException和NoSuchElementException,它们分别在Stack类和Enumeration接口...
Java 计时器 Timer 和 TimerTask 用法总结 Java 中的计时器(Timer)和 TimerTask 是一种常用的延迟执行技术,用于实现延迟执行某个任务或事件。下面将详细介绍 Timer 和 TimerTask 的用法和实现原理。 Timer ...
13. Timer和TimerTask:定时任务调度,可以安排一次或周期性的任务执行。 14. Bitset:位集,用于高效存储和操作位标志。 15. Iterator和ListIterator:迭代器接口,用于遍历集合中的元素,ListIterator还支持双向...
总结起来,这个项目使用了Java的`Timer`类和图形界面技术来创建一个可配置的定时器应用。用户可以通过界面设定时间,并通过键盘交互来控制定时器的行为。这种应用在日常开发中非常常见,例如在桌面提醒、定时备份或...
### Timer和TimerTask的使用详解 #### 一、引言 `Timer` 和 `TimerTask` 是Java中用于实现定时任务的重要工具。它们提供了一种简单有效的方式来安排任务的执行,既可以一次性执行也可以周期性地执行。这对于实现...
Java Timer定时器详解 Java Timer定时器是Java语言中的一种常用的定时器机制,它可以帮助开发者实现一些需要在特定时间或...通过使用java.util.Timer和java.util.TimerTask两个类,开发者可以轻松地实现定时器的功能。
在Java编程语言中,`Timer`和`TimerTask`是两个重要的类,它们用于调度周期性的任务执行。这两个类属于`java.util`包,提供了在后台线程中延迟执行任务或者定期执行任务的能力,这对于创建定时任务或者实现定时器...
Java中的`Timer`和`TimerTask`类是用于创建和管理定时任务的工具,它们提供了在特定时间点或按照预设间隔执行任务的功能。这两个类是Java标准库`java.util`包的一部分,对于需要定时执行操作的应用场景非常有用。 `...
它与 `java.util.TimerTask` 类配合使用,`TimerTask` 是一个抽象类,代表要定时执行的任务。下面我们将深入探讨这两个类以及如何使用它们实现任务调度。 1. **Timer类**: - `Timer` 类是一个线程类,它创建一个...
通过以上分析可以看出,`java.util.Timer`和`java.util.TimerTask`组合可以非常方便地实现定时任务的功能。但是需要注意的是,`Timer`和`TimerTask`的设计并不是线程安全的,在多线程环境下使用时需要特别注意同步...
Java中的`java.util.Timer`和`java.util.TimerTask`类提供了这样的功能,让我们能够在程序中实现定时任务。本文将深入探讨这两个类的工作原理和如何在Web环境中使用它们。 `Timer`类是Java的一个调度工具,它允许...
java提供了多种方式来实现定时任务,包括使用java.util.Timer和java.util.TimerTask类、使用java.lang.Thread类的sleep方法、使用java.util.concurrent.ScheduledExecutorService类等。 在本例子中,使用的是java....
在Java编程语言中,`Timer`和`TimerTask`是两个关键类,它们构成了Java的定时执行机制。这两个类在处理周期性任务或者延迟任务时非常有用,它们可以帮助开发者实现程序在特定时间点或者按照一定间隔执行特定操作的...
通过上述内容,我们不仅了解了如何在Java中使用`java.util.Timer`和`java.util.TimerTask`来实现定时任务,而且还学习了如何在Web应用中利用这些工具来完成周期性的任务。这种方法特别适用于需要定期执行某些操作的...
在Java编程中,`TimingTrigger`可能是指一种利用`java.util.Timer`类和`TimerTask`接口来实现的定时触发事件的机制。`java.util.Timer`是Java标准库中的一个线程安全的类,用于调度任务在未来某个时间点执行。这个...
在这种情况下,`java.util.Timer` 和 `java.util.TimerTask` 类提供了非常有用的机制来实现周期性任务。本文将深入探讨这两个类的使用方法及其相关知识点。 首先,`Timer` 类是一个线程类,它负责调度任务的执行。...
1. Java.util.Timer类和TimerTask `Timer`类是Java早期提供的定时任务实现,它允许我们创建一个定时器对象,然后调度`TimerTask`任务来执行。以下是如何使用`Timer`和`TimerTask`的基本步骤: ```java import java....
`java.util.Timer` 类和`TimerTask` 类是Java的标准库提供的定时任务工具。`Timer` 创建一个后台线程,用于调度任务。以下是如何使用`Timer` 和`TimerTask` 的基本步骤: 1. 创建一个`TimerTask` 的子类并重写`run...
在Java编程语言中,`Timer`和`TimerTask`是用于执行定时任务的重要类。这两个类通常被用来处理那些需要在指定时间或周期性执行的任务,比如定时清理缓存、定时更新数据库等场景。 #### Timer简介 `Timer`类是一个...