Timer介绍
Timer
是JDK
自带的一种最为简单的定时器实现.
Timer
在java.util
包中,最好出现在jdk1.3
线程的工具,用于在后台线程中安排将来执行的任务。 可以将任务安排为一次性执行,或者以固定间隔重复执行
每一个Timer
对象对应的是一个线程。当定时任务都执行完成后,计时器的任务执行线程会正常终止,但是这可能会发生在任意长的时间内。默认情况下,任务执行线程不作为守护线程运行,因此它能够阻止应用程序终止.如果想要快速终止,可以调用计时器的cancel
方法。
注意: Timer
类是线程安全的。
但是这个类不提供实时保证,它是使用的Object.wait()
来实现的调度任务.
在jdk1.5
之后,并发包中提供了一个 ScheduledThreadPoolExecutor
类,这个其实是Timer
组合的通用的替代品。它允许多个服务线程,接收不同的时间单位,并不需要TimerTask
.
ScheduledThreadPoolExecutor
见下一篇文章.
Timer能实现以下几种语义:
- 1.隔多久执行一次(只执行一次)
- 2.指定时间执行一次(只执行一次)
- 3.隔多久之后开始执行,每隔多久之后执行一次。
- 4.指定时间执行,每隔多久执行一次
- 5.隔多久之后开始执行,以相同的速率执行
- 6.在指定的时候之后开始执行,以相同的速率执行
隔多久执行一次(只执行一次)
/**
* 仅在5秒后执行一次,然后退出
*/
public void demo1() {
System.out.println("demo1开始执行.");
Timer demo3 = new Timer("demo1");
demo3.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Instant.now().getEpochSecond() + " demo1..执行了。。。");
}
}, new Date(System.currentTimeMillis() + 5000));
demo3.cancel();
}
指定时间执行一次(只执行一次)
/**
* 仅在指定的日期上执行一次
*/
public void demo2() {
System.out.println("demo1开始执行.");
Timer demo2 = new Timer("demo1");
demo3.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Instant.now().getEpochSecond() + " demo2..执行了。。。");
}
}, new Date(System.currentTimeMillis() + 5000));
demo2.cancel();
}
隔多久之后开始执行,每隔多久之后执行一次。
/**
* 5s后执行一次,然后每隔1s执行一次
*/
public void demo3() {
System.out.println("demo3开始执行.");
new Timer("demo3",false).schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Instant.now().getEpochSecond() + " demo3..执行了。。。");
}
}, 5000, 1000);
}
指定时间执行,每隔多久执行一次
/**
* 指定的时间上执行一次,然后每隔1s执行一次
*/
public void demo4() {
System.out.println("demo4开始执行.");
new Timer("demo4",false).schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Instant.now().getEpochSecond() + " demo4..执行了。。。");
}
}, new Date(System.currentTimeMillis() + 5000), 1000);
}
隔多久之后开始执行,以相同的速率执行
/**
* 5s后执行一次,然后每隔1s执行一次
*/
public void demo5() {
System.out.println("demo5开始执行.");
new Timer("demo5",false).scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Instant.now().getEpochSecond() + " demo5..执行了。。。");
}
}, 5000, 1000);
}
在指定的时候之后开始执行,以相同的速率执行
/**
* 指定时间后执行一次,然后每隔1s执行一次
*/
public void demo6() {
System.out.println("demo6 开始执行.");
new Timer("demo6",false).scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Instant.now().getEpochSecond() + " demo6..执行了。。。");
}
}, new Date(System.currentTimeMillis() + 5000), 1000);
}
小结
Timer
是jdk
自带的,基于Object.wait()
实现的定时器,线程安全的.JDK1.5
之后,建议使用ScheduledThreadPoolExecutor
.- 主要有两种API
Timer.schedule()
和Timer.scheduleAtFixedRate()