专题:定时器
Java
中的定时器是java.util.Timer类。
Timer
是和TimerTask都是线程,而且是彼此独立的线程
Timer
类给出一系列的scheduler()方法,用于定时执行一个TimerTask类型的对象。TimerTask的对象则包含具体的run()方法,这个方法可以调度系统所要执行的内部或外部任务。
在每一个Timer对象背后,都有一个背景线程,用来顺序执行Timer的任务。这些任务应当迅速结束,不然就会霸占timer用来执行任务的线程,从而延迟后面的任务。
当所有的任务都完成后,timer的任务执行线程就会顺利的结束并被java垃圾收集器所收集,只是垃圾收集的事件不能预测。如果程序想要迅速的结束timer的任务执行线程,调用方就应当调用timer的cancel()方法。
Timer
类是线程安全的,可以有多个线程共享一个Timer对象,而不需要同步化。Timer类实际上是用Object.wait(long)方法实现定时的,因此,Timer类不能保证实时效果,Timer类可以处理多达几千个任务。
用定时器写的Applet时钟
package
com
.
match
.
timer
;
import
java
.
awt
.
Graphics
;
import
java
.
awt
.
Color
;
import
java
.
util
.*;
import
java
.
text
.
DateFormat
;
public
class
Clock
extends
java
.
applet
.
Applet
implements
Runnable
{
private
Thread
clockThread
=
null
;
//Applet method
public
void
init
()
{
setBackground
(
Color
.
green
);
}
//Applet method
public
void
start
()
{
if
(
clockThread
==
null
)
{
clockThread
=
new
Thread
(
this
,
"Clock"
);
clockThread
.
start
();
//thread starts running
}
}
//A Thread method.
public
void
run
()
{
Thread
myThread
=
Thread
.
currentThread
();
while
(
clockThread
==
myThread
)
{
repaint
();
//causes paint() to be called
try
{
Thread
.
sleep
(
1000
);
}
catch
(
InterruptedException
e
){
}
}
}
//An applet method.
public
void
paint
(
Graphics
g
)
{
Calendar
cal
=
Calendar
.
getInstance
();
Date
date
=
cal
.
getTime
();
DateFormat
dateFormatter
=
DateFormat
.
getTimeInstance
();
g
.
drawString
(
dateFormatter
.
format
(
date
),
5
,
10
);
}
// overrides Applet's stop method, not Thread's
public
void
stop
()
{
clockThread
=
null
;
}
}