Timer是一种线程设施,用于安排之后在后台线程中执行的任务。可安排任务执行一次,或者按期重复执行,能够当作一个定时器,能够调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,因此具有了多线程的能力。 java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
java
.
util
.
TimerTask
;
public
class
MyTask
extends
TimerTask
{
private
int
id
;
public
MyTask
(
int
id
)
{
this
.
id
=
id
;
}
public
void
run
(
)
{
System
.
out
.
println
(
"线程"
+
id
+
":正在执行"
)
;
//System.gc();
}
}
|
而后主程序代码为: 多线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import
java
.
util
.
Date
;
import
java
.
util
.
Timer
;
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
{
Timer
timer
=
new
Timer
(
)
;
timer
.
schedule
(
new
MyTask
(
1
)
,
5000
)
;
// 5秒后启动任务
MyTask
secondTask
=
new
MyTask
(
2
)
;
timer
.
schedule
(
secondTask
,
1000
,
3000
)
;
// 1秒后启动任务,之后每隔3秒执行一次线程
Date
date
=
new
Date
(
)
;
timer
.
schedule
(
new
MyTask
(
3
)
,
new
Date
(
date
.
getTime
(
)
+
1000
)
)
;
// 以date为参数,指定某个时间点执行线程
// timer.cancel();
// secondTask.cancel();
System
.
out
.
println
(
"main thread 结束!"
)
;
}
}
|
Timer里面有4个schedule重载函数,并且还有两个scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
使用scheduleAtFixedRate的话,Timer会尽可能的让任务在一个固定的频率下运行。例如:在上面的例子中,让secondTask在1秒钟后,每3秒钟执行一次,可是由于java不是实时的,因此,咱们在上个程序中表达的原义并不可以严格执行,例若有时可能资源调度紧张4秒之后才执行下一次,有时候又3.5秒执行。若是咱们调用的是scheduleAtFixedRate,那么Timer会尽可能让你的secondTask执行的频率保持在3秒一次。运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,secondTask执行一次,由于系统繁忙,以后的3.5秒后secondTask才得以执行第二次,而后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。
Timer终止的问题:
默认状况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。能够经过如下3种方法终止一个timer线程:
(1)调用timer的cancle方法。你能够从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
(2)让timer线程成为一个daemon线程(能够在建立timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;
(3)调用System.exit方法,使整个程序(全部线程)终止。
TimerTask也有cancel方法。
上面所说的“只要一个程序的timer线程在运行,那么这个程序就会保持运行”。那么反过来,若是Timer里的全部TimerTask都执行完了,整个程序会退出吗,经测试是否认的,例如上面的测试代码,若是只加第一个TimerTask在Timer中执行:
timer.schedule(new MyTask(1), 5000);// 5秒后启动任务
那么5秒之后,其实整个程序仍是没有退出,Timer会等待垃圾回收的时候被回收掉而后程序会得以退出,可是多长时间呢?在TimerTask的run函数执行完之后加上System.gc();就能够了。 ide
Timer类是一种线程设施,能够用来实现某一个时间或某一段时间后安排某一个任务执行一次或按期重复执行。该功能和TimerTask配合使用。TimerTask类用于实现由Timer安排的一次或重复执行的某个任务。每个Timer对象对应的是一个线程,所以计时器所执行的任务应该迅速完成,不然会延迟后续的任务执行。
Timer类方法摘要
函数