【问题标题】:Diferences in this two approaches to sleep the excecution in java这两种在java中休眠执行的方法的区别
【发布时间】:2015-03-08 17:55:07
【问题描述】:

除了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) {...}
}

提前致谢:)

【问题讨论】:

  • 可能不是您当前关心的问题,但请不要像这样忽略InterruptedExceptions。它们不仅仅是我们应该尝试尽快摆脱​​的烦恼,而是取消线程的重要机制。如果一个被抛出,你的线程应该清理并退出自己。
  • @5gon12eder 你这么说是因为catch (InterruptedException ex) { } ??
  • 是的,这不是处理该异常的好方法。
  • @5gon12eder 在问题中,我这样写是为了简化代码,显然应该处理这个异常:)
  • 好吧,如果你已经知道了,那么请忽略我的评论。我之所以提到它,是因为我看到许多初学者 Java 程序员经常忽略异常或只是打印堆栈跟踪并继续前进(因为这恰好是 Eclipse 自动生成的内容),这是非常糟糕的做法。

标签: java multithreading performance thread-safety


【解决方案1】:

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

我还认为,这是主观的,Timer 方法更清楚地表达了您正在尝试做的事情。不过要澄清一下,这些都是完全可以理解的,其他任何查看此代码的人都可能会“明白”。

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

【讨论】:

  • 那么,第一种方法只给了我一个最容易理解的代码?
  • 个人意见,我发现第一种方法更清楚地说明了您的意图(“我希望它每 x 秒执行一次”)。它们都是完全可以理解的代码。
  • @Hector 它还为您提供了一种取消计时器的方法,并且由于关注点分离(调度与做某事)可能更容易测试
【解决方案2】:

Timer 依赖于系统时间,因此系统时间的任何更改都会影响 Timer 的触发器。

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

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

【讨论】:

  • 如果在TimerTask 类的run 方法中我调用垃圾收集器并在aech 迭代中执行?
  • 是的,每次都会执行,但不建议从代码中调用垃圾收集器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2013-09-08
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多