`

j2se----Timer和TimerTask

    博客分类:
  • J2SE
阅读更多
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天,那么一天执行一次, period = 60*60*1000*24 表示一天,其实从单位就能看出来他的具体单位,因为是long,那么一定对应毫秒,如果是int,那么一定对应秒

还有一个方法,是scheduleAtFixedRate()
schedule()方法的执行时间间隔永远是固定的,如果之前出现了延迟的情况,之后也会继续按照设定好的时间间隔来执行

scheduleAtFixedRate();方法可以根据出现的延迟时间自动调整下一次间隔的执行时间



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线程就会自动结束




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics