这两种睡眠方法在java中执行的差异

时间:2015-01-10 14:03:28

标签: java multithreading performance thread-safety

schedule方法的构造函数中的延迟选项外,这两种方法的主要区别是什么,这两种方法的优点是性能最佳线程安全性执行??

Timer temporizer = new Timer();
TimerTask task = new TimerTask(){
    @Override
    public void run() {
        // iterate something
    }
};
temporizer.schedule (task,delay,interval);

或简单的

while (true){
    // iterate something
    try { 
        Thread.sleep(interval); 
    } catch (InterruptedException ex) {...}
}

提前致谢:)

2 个答案:

答案 0 :(得分:2)

Timer方法与基于睡眠的实现的主要好处是您可以取消它。通过在睡眠版本中执行while(true),您实际上无法彻底取消它。

我也会争辩,这是主观的,Timer方法更清楚地表达了你想要做的事情。尽管如此,这些都是完全可以理解的,任何看过这段代码的人都可能“得到它”。

Timer方法的另一个好处是,您可以将迭代逻辑封装在TimerTask中,并将其与实际时间和调度分开。这样可以更容易测试。更重要的是,如果你把它放在自己的类中,而不是像你那样定义它。

答案 1 :(得分:1)

定时器取决于系统时间,因此系统时间的任何变化都会影响定时器的触发。

Thread.sleep不会对系统时间的变化产生任何影响。

此外,如果不立即收集垃圾,Timer会创建一个会影响内存的任务队列。更多的计时器将在堆上添加更多对象。 Thread.sleep()只会暂停线程,因此内存影响很小。