java多线程编程要点(二)

4、 TimerTimerTask的使用

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,这些任务可以被执行一次,也可以被定期执行。每个 Timer 对象对应一个后台线程,顺序地执行所有计时器任务。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程,从而可能延迟后续任务的执行。对 Timer 对象最后的引用完成并且所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。TimerTask是一个抽象类,实现了Runable接口,它的子类代表一个可以被Timer计划的任务。csdn上另外一篇博文:http://blog.youkuaiyun.com/siyue_qi/archive/2008/05/22/2469316.aspx,比较详细的阐述了TimerTimerTask的使用。

1) 一个简单的Demo,让大家对TimerTimerTask的使用有感性的认识。

import java.io.IOException;

import java.util.Timer;

public class TimerTest {

public static void main(String[] args)...{

Timer timer = new Timer();

timer.schedule(new MyTask(), 1000, 2000);//1秒后执行此任务,每次间隔2

while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了

try {

int ch = System.in.read();

if(ch-'c'==0){

timer.cancel();//使用这个方法退出任务

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

static class MyTask extends java.util. TimerTask {

@Override

public void run() {

System.out.println("TimerTask run.");

}

}

}

2) TimerTimerTask的常用api函数说明

Timer

schedule(TimerTask task, long delay), 延迟delay时间后执行task任务;

Timer

schedule(TimerTasktask,longdelay,longperiod), 延迟delay时间后执行task任务,之后每隔period都会执行task任务;

Timer

schedule(TimerTask task,Date time),到达指定的时间time执行task任务;

Timer

schedule(TimerTask task,Date firstTime,long period),到达指定的时间firstTime执行task任务,之后每隔period都会执行task任务;

Timer

scheduleAtFixedRate(TimerTask task,long delay, long period),延迟delay时间后执行;

Timer

scheduleAtFixedRate(TimerTask task,Date firstTime,long period),到达指定的firstTime时间即执行task任务,之后每隔period都会执行task任务;

Timer

cancel(),终止此计时器,丢弃所有当前已安排的任务,当前已经执行的task会继续执行,直至结束;

TimerTask

run()方法,task的任务体,task真正process之处;

TimerTask

cancel(),终止特定task的运行。

这里强调Timer类的schedulescheduleAtFixedRate的区别。schedulescheduleAtFixedRate的区别在于,schedule以固定的相对时间间隔执行,如果某一次执行被延时了,往后的执行的执行时间也会相对延时;而scheduleAtFixedRate是以绝对的时间间隔执行,如果某一次执行被延时,它的后一次执行的延时将会缩短(scheduleAtFixedRate会把已经过去的时间也作为周期执行)。schedule注重的是时间间隔的稳定,而scheduleAtFixedRate注重的是执行频率的稳定。

3) Timer的终止

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:

a)调用timercancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer taskrun方法里;

b)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;

c)当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止;

d)调用System.exit方法,使整个程序(所有线程)终止。

总结:TimerTimerTask可以简单理解为Timer定时器在触发TimerTask任务调用,通常用schedulescheduleAtFixedRate方法来调用timertask任务,cancle来终止任务调用。Timer简单易用,比较适合提供轻量级的计时器功能,但是对时效性很强的任务调度请用其它方法来实现(正如javadoc所述”Timer does not offer real-time guarantees: it schedules tasks using the Object.wait(long) method”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值