java.util.Timer:它已被弃用了吗?

我读了一篇关于这个答案的评论以及关于不推荐使用java.util.Timer调度(抱歉,没有引用)的许多其他问题。 我真的希望不要因为我使用它作为在Java中安排事物的轻松方式(并且它工作得很好)。 但如果它被弃用了,我会去别处看看。 但是,快速查看1.6的API文档并没有说明它被弃用的任何内容。 在Sun的弃用列表中甚至没有提到它。

是否正式弃用*如果是这样,我应该使用什么呢?


*另一方面, 如果它没有被弃用那么人们是否可以停止对这种无辜且精彩实施的集合类进行诋毁?

[JDK-8154799]在JDK的bug跟踪器中弃用了Timer和TimerTask ,并且在2016年中期JEP 277声明java.util.Timer (和TimerTask )将在JDK 9中弃用。

多个Java SE API将添加,更新或删除@Deprecated注释。 下面列出了这些变化的一些例子。

[…]

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

但是,在JDK 9发行版中,不推荐使用这些类(不推荐使用的类可以在不推荐使用的列表中找到)。

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

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

我认为这是一个误解。 Timer类的JavaDoc提到了ScheduledThreadPoolExecutor并注意到,这个类实际上是 Timer / TimerTask组合的更通用的替代品 。 没有其他的。 不推荐使用Timer。

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

ThreadPoolExecutor,可以额外调度命令在给定延迟后运行,或定期执行。 当需要多个工作线程时,或者当需要ThreadPoolExecutor(此类扩展)的额外灵活性或function时,此类优于Timer。

不,不是全部。 您可能希望使用其他机制(如Quartz)来满足更复杂的计时器要求,但Timer可以很好地工作,并且不会去任何地方。

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

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

在jdk1.6_10中它没有被弃用,因此不需要替代方案。