Timer 的缺陷

摘要:
java.util.Timer计时器有管理任务延迟执行以及周期性执行。Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。publicclassOutOfTime{publicstaticvoidmainthrowsException{Timertimer=newTimer();timer.schedule;SECONDS.sleep;timer.schedule;SECONDS.sleep;}staticclassThrowTaskextendsTimerTask{publicvoidrun(){/*try{Thread.sleep;}catch{//TODOAuto-generatedcatchblocke.printStackTrace();}*/thrownewRuntimeException();}}}执行结果Exceptioninthread"Timer-0"java.lang.RuntimeExceptionatnet.jcip.examples.OutOfTime$ThrowTask.runatjava.util.TimerThread.mainLoopatjava.util.TimerThread.runExceptioninthread"main"java.lang.IllegalStateException:Timeralreadycancelled.atjava.util.Timer.schedatjava.util.Timer.scheduleatnet.jcip.examples.OutOfTime.mainTimer单线程执行任务,任务有可能丢失或执行时间不准确。

java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。

Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。

public classOutOfTime {
    public static void main(String[] args) throwsException {
        Timer timer = newTimer();
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(1);
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(5);
    }
    static class ThrowTask extendsTimerTask {
        public voidrun() {
            /*try {
                 Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
            throw newRuntimeException();
        }
    }
}

执行结果

Exception in thread "Timer-0"java.lang.RuntimeException
    at net.jcip.examples.OutOfTime$ThrowTask.run(OutOfTime.java:31)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Exception in thread "main"java.lang.IllegalStateException: Timer already cancelled.
    at java.util.Timer.sched(Timer.java:397)
    at java.util.Timer.schedule(Timer.java:193)
    at net.jcip.examples.OutOfTime.main(OutOfTime.java:19)

Timer单线程执行任务,任务有可能丢失或执行时间不准确。

Timer执行任务时只是创建了单个线程。如果一个时间任务执行的时间比较长,那么其他任务执行时间的准确性就会受影响。比如每隔1秒执行一次任务,中间有个长任务执行时间超过5秒,那么在上一个任务执行完成时,会快速执行4次或者丢失任务。

public classOutOfTime {
    public static void main(String[] args) throwsException {
        Timer timer = newTimer();
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(1);
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(5);
    }
    static class ThrowTask extendsTimerTask {
        public voidrun() {
            try{
                Thread.sleep(5000);
            } catch(InterruptedException e) {
                //TODO Auto-generated catch block
e.printStackTrace();
            }
            throw newRuntimeException();
        }
    }
}

执行结果

Exception in thread "Timer-0"java.lang.RuntimeException
    at net.jcip.examples.OutOfTime$ThrowTask.run(OutOfTime.java:31)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

免责声明:文章转载自《Timer 的缺陷》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇1.golang数据类型,转换,变量类型检查,生命周期、闭包,打印方法,指针简介es-09-spark集成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JIRA的使用介绍(三)- Xray

  JIRA是一个流行的产品,除了其自身功能强,可扩展性好以外,JIRA还拥有一个庞大的生态圈。拥有众多的插件开发商、合作伙伴和用户。 从产品层面看,JIRA产品具备很强的扩展能力,例如对于问题单类型、流程、表单、字段,报表,通知,权限配置都是可以定制的,而且还内置或者可以定制很多方案(Schemes)方便扩展。 另外JIRA产品拥有支持Add-On(插件...

常用的软件测试方法

随着软件测试技术的不断发展,测试方法也越来越多样化,针对性更强;选择合适的软件测试方法可以让我们事半功倍。以下是一些常用的软件测试方法:   β测试_Beta测试   β测试,英文是Beta testing。又称Beta测试,用户验收测试(UAT)。   β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试...

TMMi成熟度级别和过程域

作为过程改进的阶段型架构,TMMi包含了不同的阶段和成熟度级别。组织可以通过TMMi使测试过程中初始未管理的状态,逐步进化为已管理、已定义和已测量状态,并最终达到持续改进的状态,即优化的过程。除了初始级,其他每个成熟度级别,都需要确保有足够的改进,使其成为下一个级别的基础。TMMi内部的丰富测试实践有助于组织系统化学习和应用,以增量的步骤持续改进测试过程...

缺陷管理工具JIRA破解版及其安装方法

JIRA是一个优秀的问题(or bugs,task,improvement,new feature )跟踪及管理软件。    它由Atlassian开发,采用J2EE技术.它正被广泛的开源软件组织,以及全球著名的软件公司使用,它堪称是J2EE的Bugzilla。   JIRA提供了全面的功能,界面十分友好,可用性以及可扩展性方面都十分出色,如果购买商业版许...