Timer

本文详细介绍了Java中的Timer和TimerTask组件。包括它们的基本概念、如何终止Timer线程、任务调度方法的区别以及一些注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Timer和TimerTask详解
1.Timer和TimerTask
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以
指定执行一次或反复执行多次。 TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任
务。
2.终止Timer线程
默认情况下,创建的timer线程会一直执行,主要有下面四种方式终止Timer线程:
(1)调用Timer的cancel方法

(2)把Timer线程设置为daemon线程,(new Timer(true)创建daemon线程),在JVM里,如果所有用户线程结束,

那么守护线程也会被终止,不过这种方法一般不用。

(3)当所有任务执行结束后,删除对应timer对象的引用,线程也会被终止。
(4)调用System.exit方法终止程序。
3.关于cancel方式终止线程
这种方式终止timer线程,jdk的实现比较巧妙
cancel方法的源码
public void cancel(){
synchronized(queue){
thread.newTasksMayBeScheduled=false;
queue.clear();
queue.notify();
}
}
没有显示的线程stop方法,而是调用了queue的clear方法和queue的notify方法,clear是个自定义方法,notify
是object自带的方法,很明显是去唤醒wait方法的。
clear方法:
void clear(){
for(int i==1;i<=size;i++){
queue[i]=null;
}
size=0;
}
clear()方法很简单,就是去清空queue,queue是一个TimerTask的数组,然后把queue的size重置为0,变成empty。
new Timer()代码:
public Timer(){
this("Timer-"+serialNumber());
}
public Timer(String name){
thread.setName(name);
thread.start();
}

内部变量thread
TimerThread thread=new TimerThread(queue);
不是原生的Thread,是自定义的类TimerThread。这个类实现了Thread类,重写了run方法,如下:
public void run(){
try{
mainLoop();
}finally{
synchronized(queue){
newTaskMayBeScheduled=false;
queue.clear();
}
}
}

最后是这个mainLoop方法
private void mainLoop(){
while(true){
try{
TimerTask task;
boolean taskFired;
synchronized(queue){
while(queue.isEmpty&&newTaskMayBeScheduled){
queue.wait();
}
if(queue.isEmpty()){
break;
}
}
}
}
}

可看到,之前的notify就是通知到这个wait,然后clear方法在notify之前作了清空数组的操作,所以会break,
线程执行结束,退出。
5.反复执行一个任务
通过调用三个参数的schedule方法实现,最后一个参数是执行间隔,单位毫秒
6.schedule VS scheduleAtFixedRate

这两个方法都是任务调度方法,他们之间区别是,schedule会保证任务的间隔是按照定义period参数严格执行的,

如果某一次调度时间比较长,那么后面的时间会顺延,保证间隔都是period,而scheduleAtFixedRate是严格按

照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间内执行。

注意点:
每一个Timer仅对应唯一一个线程
Timer不保证任务执行的非常准确
Timer类的线程是安全的。























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值