【问题标题】:java.util.Timer: Is it deprecated?java.util.Timer:它被弃用了吗?
【发布时间】:2011-01-13 20:41:04
【问题描述】:

我在对this answer 的评论中读到了java.util.Timer 已弃用的许多其他关于调度的问题(抱歉,没有参考)。我真的希望不要,因为我将它用作在 Java 中安排事情的简便方法(而且它工作得很好)。但如果它被弃用,我会在别处寻找。 但是,快速浏览一下 API docs for 1.6 并没有说明它已被弃用。 Sun 的 Deprecated List 甚至都没有提到它。

它是否已正式弃用*,如果是,我应该改用什么?


*另一方面,如果它不被弃用,人们是否可以停止诋毁这种无辜且出色实现的 set-o-classes?

【问题讨论】:

  • java.util.Timer 写得远非出色。编写可测试的代码既不灵活也很困难。 ScheduledExecutorService 在所有可衡量的方面都更好。
  • @skaffman,这可能是正确的。我唯一的问题是ScheduledExecutorService 是否和Timer 一样轻量级。这只是Object.wait(long) 上的一个薄包装……那么预定……呢?
  • 源代码在那里,你自己看看。我能说的是java.util.concurrent 的东西(包括ScheduledExecutorService)是为极高的吞吐量而设计的,Timer 从来没有。
  • 谢谢@skaffman,我会检查他的来源。

标签: java timer


【解决方案1】:

在 jdk1.6_10 中它没有被弃用,所以不需要替代品。

【讨论】:

  • java.util.Date 也没有被弃用,但这非常需要替代方案。
  • Observer / Observable 也是如此。
  • @skaffman 你用什么代替java.util.Date?如果他们不弃用这些东西,我怎么知道不使用它们?
  • @yar :当您意识到它们是垃圾时,您就知道不要使用它们。用你的判断。 java.util.Date 的实际替代品是 JodaTime。
【解决方案2】:

没有。不是全部。对于更复杂的计时器要求,您可能希望使用其他机制(例如 Quartz),但 Timer 工作得非常好,而且不会随处可见。

【讨论】:

  • 谢谢你。我也会去看看 Quartz。
  • 是的,Quartz 非常出色,虽然 API 不是那么好。然而,Spring 提供的 Quartz 包装器使它更有用/更灵活。
【解决方案3】:

我认为这是一个误解。 Timer 类的 JavaDoc 提到了ScheduledThreadPoolExecutor 并指出,这个类实际上是 Timer/TimerTask 组合的更通用的替代品。没有其他的。计时器未弃用。

这次来自 JavaDoc 的另一个引用,ScheduledThreadPoolExecutor:

一个 ThreadPoolExecutor 可以额外安排命令在给定延迟后运行,或定期执行。当需要多个工作线程时,或者需要 ThreadPoolExecutor(此类扩展)的额外灵活性或功能时,此类比 Timer 更可取。

【讨论】:

  • 谢谢。那么你认为,就实现的权重而言——速度、内存使用、CPU 使用——Timer 是最轻的选项吗?
  • 定时器是“轻量级”的,因为它只有一个后台线程。请注意,Timer 和 ScheduledExecutorService 在内部都使用数组来保存计划任务。因此,调度 10,000,000 个任务然后取消它们将使数组大小保持在 10,000,000。实际上,这很少会成为问题。
  • 老实说,在大多数情况下,我不知道也不关心性能。如果我遇到性能问题,那么通过 ScheduledThreadPoolExecuter 交换 Timer.sleep() 将是我看到的最后一件事......
  • 对不起@Andreas_D 我通常也不关心性能,但我正在使用 Timer - 成功 - 来创建 MIDI 音符循环器。因此,如果每秒很容易有 1K 计划任务......另一方面,也许我通过使用计时器已经走向了一个绝对疯狂的方向。
【解决方案4】:

不,它没有被弃用。除了 Sun 的 Deprecated List,您还会在 JavaDoc 中看到关于已弃用的类的注释。例如,StringBufferInputStream 的注释说:

已弃用。此类没有正确地将字符转换为字节。从 JDK 1.1 开始,从字符串创建流的首选方法是通过 StringReader 类。

【讨论】:

  • 谢谢比尔,问题中提到了已弃用的列表。我想知道是否有一些内幕消息让人们知道 Timer 已被弃用(或什么)。
  • @yar:哦,是的,我没有注意到“这里”这个词是有关联的。 Timer 类的 JavaDoc 本身会有一个注释,让您知道它是否曾经被弃用。
  • 谢谢比尔,我承认链接词 here 不是锚文本的最佳实践:)
  • @yar:我犯了同样的错误,所以我不能大声抱怨。 :)
  • 我们都是<a href='there'>there</a>
【解决方案5】:

正如其他人所提到的,不,它并没有被弃用,但我个人总是使用ScheduledExecutorService,因为它提供了更丰富的 API 和更大的灵活性:

  • ScheduledExecutorService 允许您指定线程数,而 Timer 始终使用单个线程。
  • ScheduledExecutorService 可以用 ThreadFactory 构造,允许控制名称/守护进程状态以外的线程方面(例如优先级、ThreadGroupUncaughtExceptionHandler)。
  • ScheduledExecutorService 允许以固定延迟和固定速率安排任务。
  • ScheduledExecutorService 接受 Callable / Runnable 作为工作单元,这意味着您不需要专门为 TimerTask 子类化来使用它;即,您可以将相同的 Callable 实现提交给常规的 ExecutorServiceScheduledExecutorService

【讨论】:

  • 最后一个好处对我来说可能很有趣。但除此之外,我担心 ScheduledEx... 可能会“更重”。想法?
  • 假设您使用单个线程创建 ScheduledExecutorService,您不太可能看到任何性能差异(尽管 Timer 包含其自己的优先级队列实现)。
【解决方案6】:

在 JDK 的错误跟踪器中有 [JDK-8154799] deprecate Timer and TimerTask,在 2016 年年中,JEP 277 表示 java.util.Timer(和 TimerTask)将在 JDK 9 中被弃用。

一些 Java SE API 将添加一个 @Deprecated 注解, 更新或删除。下面列出了此类更改的一些示例。

[…]

  • 将@Deprecated 添加到java.util.TimerTimerTask

但是,在 JDK 9 版本中,这些类并未被弃用(弃用的类可在 Deprecated List 中找到)。

【讨论】:

  • 谢谢。读者应该在这里看到以前接受的答案:stackoverflow.com/a/2213146/8047
  • @Martin:截至今天(2017 年 6 月 26 日),我没有看到任何对 Timer 或 TimerTask 的引用被弃用。也许他们已从列表中删除。
  • @FractalBob 实际上这些类没有出现在JDK9 Deprecated List 中。我找到了this bug report——看起来还没有决定它们是否会被弃用(请参阅 2016-10-04 21:40 在活动→全部下的更改)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
相关资源
最近更新 更多