jiaguwen123 发表于 2013-2-7 03:55:45

j2se----Timer和TimerTask

Timer是一个定时器对象,本来可以用Thread.sleep()来休眠进程的,但是我们如果只要休眠一个进程中的一部分代码就可以把那部分代码写在一个TimerTask里面,然后用定时器对象来定时执行   

schedule(TimerTask task,long delay)//延迟多少秒执行,且只执行一次   
schedule(TimerTask task,Date time) //指定在什么时间执行,且只执行一次   
schedule(TimerTask task,long delay,long period)//延迟多少秒执行,且执行周期是多少   
schedule(TimerTask task,Date time,long period)//指定在什么时间执行,周期是多少,如果周期是1天,那么一天执行一次   

TimerTask类实现了Runnable接口。。。   

new Timer().schedule(new TimerTask(){   
      public void run(){   
         //dosometing   
          Runtime.getRuntime().exec("calc.exe");//启动windows自带的计算器   
      }   
},3000);//注意如果这样搞出来的话,那么当run()里面执行完了后,这个线程也不一定马上结束,所以需要手动结束比较好   

下面看如何改:方法一:   
final Timer tm = new Timer().schedule(new TimerTask(){   
      public void run(){   
         //dosometing   
          Runtime.getRuntime().exec("calc.exe");//启动windows自带的计算器   
            tm.cancel();   
       }   
      
},3000);   

方法二:如果不想写成final 就只有传递进去了   
class MyTimerTask extends TimerTask{   
      private Timer tm;   
      public MyTImerTask(Timer tm){   
         this.tm = tm;   
      }   
      public void run(){   
          Runtime.gerRuntime().exec("calc.exe");   
          tm.cancel();   
      }   
}   

Timer tm = new Timer();   
tm.schedule(new MyTimerTask(tm),3000);   

注意:其实schedule方法就是封装了线程的Thread.sleep()方法,和start()方法。。。   





注意:new Timer()是new一个非Deamon线程,所以当主线程结束的时候他不会结束   
new Timer(true)是new 了一个Deamon线程,所以当一个进程中的所有非Deamon线程都结束之后,那么Deamon线程就会自动结束
页: [1]
查看完整版本: j2se----Timer和TimerTask