Timer与TimerTask

http://nmj1987.iteye.com/blog/343748

 

Timer与TimerTask是java中比较常用的类,可以定期重复执行某项任务。以前我还不知道这两个类是,一般用Thread来处理,虽然同样可以解决问题,但效率上可能就差了些。既然java内建了这两个类,那就必然有它们的好处了。

   顾名思义,Timer应该是个计时器,而TimerTask是需要计时的任务。

   下面通过一个小例子看看这两个类是如何让工作的:

 

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class TimerTest extends TimerTask
{
    private Timer timer;
    
    public static void main(String[] args)
    {
    	TimerTest timerTest= new TimerTest();
    	timerTest.timer = new Timer();
    	
    	//立刻开始执行timerTest任务,只执行一次
    	timerTest.timer.schedule(timerTest,new Date());
    	
    	//立刻开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
    	//timerTest.timer.schedule(timerTest,new Date(),2000);
    	
    	//一秒钟后开始执行timerTest任务,只执行一次
    	//timerTest.timer.schedule(timerTest,1000);
    	
    	//一秒钟后开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
    	//timerTest.timer.schedule(timerTest,1000,2000);
    	
    	//立刻开始执行timerTest任务,每隔2秒执行一次
    	//timerTest.timer.scheduleAtFixedRate(timerTest,new Date(),2000);
    	
    	//一秒钟后开始执行timerTest任务,每隔2秒执行一次
    	//timerTest.timer.scheduleAtFixedRate(timerTest,1000,2000);
    }

	@Override
	public void run()
	{
		System.out.println("Task is running!");
	}
}

      需要注意的是scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果是不同的。上面例子中任务只是打印一个字符串,比较简单。但如果任务比较复杂,或者由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则scheduleAtFixedRate方法将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”;而schedule方法的后续执行也将被延迟。所以,在长期运行中,scheduleAtFixedRate执行的频率将正好是指定周期的倒数,schedule 执行的频率一般要稍慢于指定周期的倒数。

      另外,TimerTask的构造函数是protected,所以无法再类中直接new一个TimerTask,而只能写一个类继承TimerTask。

 

      知道了如何执行任务,那么如何终止任务呢?TimerTask与Timer都有cancel()方法。

Java代码 复制代码  收藏代码
  1. import java.util.Date;   
  2. import java.util.Timer;   
  3. import java.util.TimerTask;   
  4.   
  5.   
  6. public class TimerTest extends TimerTask   
  7. {   
  8.     private Timer timer;   
  9.        
  10.     public static void main(String[] args)   
  11.     {   
  12.         TimerTest timerTest= new TimerTest();   
  13.         timerTest.timer = new Timer();   
  14.            
  15.         //立刻开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次  
  16.         timerTest.timer.schedule(timerTest,new Date(),2000);   
  17.            
  18.         try  
  19.         {   
  20.             Thread.sleep(10000);   
  21.         } catch (InterruptedException e)   
  22.         {   
  23.             e.printStackTrace();   
  24.         }   
  25.         //结束任务执行,程序终止   
  26.         timerTest.timer.cancel();   
  27.         //结束任务执行,程序并不终止,为什么呢,还没想明白   
  28.         //timerTest.cancel();   
  29.     }   
  30.   
  31.     @Override  
  32.     public void run()   
  33.     {   
  34.         System.out.println("Task is running!");   
  35.     }   
  36. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值