Java Timer vs ExecutorService?

我有代码,我使用.我环顾四周,看到也可以做同样的事情。所以这个问题在这里,你有没有使用和安排任务,一个使用比另一个有什么好处?java.util.TimerExecutorServiceTimerExecutorService

还想检查是否有人使用过该类,并遇到为他们解决的任何问题。TimerExecutorService


答案 1

根据Java并发实践

  • Timer可以敏感地改变系统时钟,不是。ScheduledThreadPoolExecutor
  • Timer只有一个执行线程,因此长时间运行的任务可能会延迟其他任务。 可以配置任意数量的线程。此外,如果需要,您可以完全控制创建的线程(通过提供 )。ScheduledThreadPoolExecutorThreadFactory
  • 运行时异常在中抛出会杀死该线程,从而使死 :-( ...即计划任务将不再运行。 不仅可以捕获运行时异常,还可以根据需要处理它们(通过重写 来自 的方法)。引发异常的任务将被取消,但其他任务将继续运行。TimerTaskTimerScheduledThreadExecutorafterExecuteThreadPoolExecutor

如果可以使用 代替 ,请这样做。ScheduledThreadExecutorTimer

还有一件事...虽然在Java 1.4库中不可用,但有一个JSR 166(java.util.concurrent)到Java 1.2,1.3,1.4的Backport,它具有该类。ScheduledThreadExecutorScheduledThreadExecutor


答案 2

如果您可以使用它,那么很难想出不使用Java 5执行器框架的理由。叫:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

将为您提供 与 类似的功能(即它将是单线程的),但其访问可能稍微更具可扩展性(在引擎盖下,它使用并发结构而不是像类那样完全同步)。使用 a 还可以为您提供以下优势:ScheduledExecutorServiceTimerTimerScheduledExecutorService

  • 如果需要,您可以对其进行自定义(请参阅 或 类)newScheduledThreadPoolExecutor()ScheduledThreadPoolExecutor
  • “一次性”执行可以返回结果

关于坚持我能想到的唯一原因是:Timer

  • 它是在Java 5之前可用的
  • J2ME 中提供了类似的类,这可以使移植应用程序更容易(但在这种情况下,添加公共抽象层并不是非常困难)