论坛首页 编程语言技术论坛

Timer的混乱行为

浏览 10380 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-02  

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

public class OutOfTime
{
    public static void main(String[] args) throws InterruptedException
    {
        Timer timer = new Timer();
        timer.schedule(new ThrowTask(), 1);
        Thread.sleep(1000);
        timer.schedule(new ThrowTask(), 1);
        Thread.sleep(5000);
    }

    static class ThrowTask extends TimerTask
    {
        public void run()
        {
            throw new RuntimeException();
        }
    }
}

   发表时间:2012-02-02  
Exception in thread "Timer-0" java.lang.RuntimeException
at Test.OutOfTime$ThrowTask.run(OutOfTime.java:25)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Exception in thread "main" java.lang.IllegalStateException: Timer already cancelled.
at java.util.Timer.sched(Timer.java:354)
at java.util.Timer.schedule(Timer.java:170)
at Test.OutOfTime.main(OutOfTime.java:15)

有什么混乱么?
第一个异常是ThrowTask(thread "Timer-0")抛出的,此时timer被cancelled
第二个异常是jvm(thread "main")抛出的.即执行第二句timer.schedule(new ThrowTask(), 1);时,判断timer对象状态是cancelled,而抛出异常.程序结束.
0 请登录后投票
   发表时间:2012-02-03  
主要是一般的情况下,肯定不希望第一个工作的异常,影响到第二个工作任务的执行。
0 请登录后投票
   发表时间:2012-02-03  
要么使用多个timer,要么做好Exception处理
0 请登录后投票
   发表时间:2012-02-07  
对,或者使用Executor
0 请登录后投票
   发表时间:2012-02-15  
Timer都不推荐使用了吧,用Executor框架吧。
0 请登录后投票
   发表时间:2012-02-17  
Timer有几个问题:
1、run抛出异常,在一些平台中(如win)可以继续运行,一些平台就直接终止掉了,如AIX

2、修改系统时间,会导致Timer终止

所以,在jdk1.5及以后,Timer应该被废弃使用,ScheduledExecutorService才是首选
0 请登录后投票
   发表时间:2012-02-19  
这不算混乱吧,只是你在用之前不清楚它的规则
0 请登录后投票
   发表时间:2012-02-20  
继承TimerTask类然后在该类中定义异常,主方法直接调用该子类实现该方法就可以就可以
0 请登录后投票
   发表时间:2012-02-20  
这么走才是正常的
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics