posts - 60,comments - 71,trackbacks - 0

     在要定时执行某一任务时,在精度不是要求很高的情况下,一般使用Java.util.TimerTask类来完成(要精确度较高的要求下可采用Quarta开源插件),使用
TimerTask类完成定时任务开发时,很简单,只需以下二步:
!)定义一个继承TimerTask类的类,重写run()方法,在该方法中实现自已的业务逻辑;
2)在主类中定义一个Timer类对象,用该对象的schedule()或scheduleAtFixedRate()来实现定时任务的执行(这两个方法有一定的区别,这里不作介绍);

这样就完成了任务的定时执行,其实 TimerTask类也是基于线程(Thread)的实现,所以继承了TimerTask的类要重写run()方法,在该方法中实现自已的任务.

现在有一点要说明下,即在创建Timer类对象时,有两种方法:
1)Timer tm = new Timer(); //创建一个非守护线程
2)Timer tm = new Timer(true);
//创建一守护线程

让timer线程成为一个daemon线程,这样当程序只有daemon线程的时候,它就会自动终止运行.如果有非守护线程在运行,则守护线程一直存在.
现举例如下:
1)
    public static void main(String[] args) {

        Timer tm 
= new Timer(true); //创建一守护线程
        tm.schedule(
new TestTask(),2*1000);
}
 
TestTask()类中重写的run()方法很简单,只是输出一条语句,但这段代码是没有输出结果的,因为主线程启动后就停止了,所以tm这个守护线程就也不存在了,所以没有输出结果,现在改下代码:
2)
 public static void main(String[] args) {
       
        
try {
         Thread.sleep(
6*1000);
        }

        
catch(Exception e) {
           e.printStackTrace();
        }

        Timer tm 
= new Timer(true);
        tm.schedule(
new TestTask(),2*1000);
}

但这段代码也还是没有输出的,因为主线程睡眠了6秒钟后,守护线程才产生,但这时主线程睡眠了6秒钟后就已经消亡了,所以守护线程就也不存在了,但如果让主线程睡眠放在schedule()方法后面执行,则就会有输出,即:
3)
Timer tm = new Timer(true);//创建一守护线程

        tm.schedule(
new TestTask(),2*1000);

        
try {
            Thread.sleep(
6*1000);
        }

        
catch(Exception e) {
            e.printStackTrace();
        }
这是会有输出的,因为主线程启动后,守护线程也启动了,而主线程睡眠6秒钟,守护线程过2秒后执行,2秒时间在6秒时间内,所以在主线程消亡之前,守护线程还存在,所以有输出,但要保证主线程睡眠的时间大于或等于(等于的情况我试过几次,都有输出,但不保证一定会有输出,因为TimerTask有定时不精确的情况)定时任务的时间段(这里是2秒),即如果这里设为7秒或大于6秒的其它值,是不会有输出的.

另:这里有几种情况要说明下:
1)上面几种例举的情况是指创建守护线程(即创建Timer对象时带true这个参数,如果不带参数,则表示创建的是非守护线程)的情况,如果创建的是非守护线程,则不管哪种情况,一定会有输出的.
2)针对上面几种情况,如果在调用schedule()方法时,使用的是三个参数的(上面都是带两个参数),且第二个参数为0的话,则上面的几种情况,也都是会有输出的,因为第二个参数为0的话,表示的意思是立即执行.如上面第二种情况,如果改成这样:tm.schedule(new TestTask(),0,2*1000);守护线程虽然后是等主线程睡眠6秒主才产生(且这时主线程已经消亡),但产生守护线程时,守护线程立即执行,所以也会能输出.

注:守护线程的特点是,只要线程队列中没有非守护线程(即普通的我们常见的线程都为非守护线程),则所有的守护线程也将全部消亡.
创建守护线程的方法是,线程对象调用: threadObj.setDaemon(true);即可将threadObj该线程设为守护线程.
posted on 2008-05-28 10:01 henry1451 阅读(721) 评论(0)  编辑  收藏 所属分类: Java技术

只有注册用户登录后才能发表评论。


网站导航: