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

时间:2010-02-06 12:44:51

标签: java timer

我在对this answer的评论和其他许多关于java.util.Timer被弃用的日程安排(抱歉,没有参考)的问题中读到了。我真的希望不要因为我使用它作为在Java中安排事情的轻松方式(并且它工作得很好)。但如果它被弃用了,我会去别处看看。 但是,快速查看API docs for 1.6并未说明它被弃用。在Sun的Deprecated List中甚至没有提及。

是否正式弃用 * ,若然,我应该使用什么呢?


* 另一方面,如果没有弃用,那么人们是否会停止对这个无辜且出色的set-o-classes进行恶意攻击?

6 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:7)

我认为这是一种误解。 Timer类的JavaDoc提到ScheduledThreadPoolExecutor并注意到,这个类实际上是Timer / TimerTask组合的一个更通用的替换。没有其他的。计时器不被弃用。

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

  

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

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

  

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

答案 4 :(得分:4)

JDK的错误跟踪器中有[JDK-8154799] deprecate Timer and TimerTask,并且在2016年中期JEP 277声明在JDK 9中将弃用java.util.Timer(和TimerTask

  

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

     

[...]

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

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

答案 5 :(得分:2)

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