使用场景:
需要定时或周期性地执行某些任务(如:服务器定时像检查中心发送心跳信息)。
思路1:定时器在一个循环中,每wait一定时间就执行任务(执行对应的方法)。
@Override
public void run() {
while (goon) {
synchronized (lock) {
try {
lock.wait(delay);
//TODO执行任务
} catch (InterruptedException e) {
goon = false;
}
}
}
}
优点:一个线程去定时执行任务,消耗资源少
缺点:若单个任务执行时间较长(代码较繁琐),会造成定时不准确。(假设单个任务执行时间大于延时甚至很多,定时就没有存在的意义了)。
思路2:每次延时后,创建一个线程去执行任务。定时器延时不受任务执行时间的干扰。
@Override
public void run() {
while (goon) {
synchronized (lock) {
try {
lock.wait(delay);
new work().start();
} catch (InterruptedException e) {
goon = false;
}
}
}
}
优点:定时十分精确。
缺点:若延时时间太短,容易在短时间造成大量的线程创建与销毁,拖慢系统性能。