六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 53|回复: 0

j2se----Timer和TimerTask

[复制链接]

升级  52.67%

33

主题

33

主题

33

主题

秀才

Rank: 2

积分
129
 楼主| 发表于 2013-2-7 03:55:45 | 显示全部楼层 |阅读模式
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线程就会自动结束
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表