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.Timer
和TimerTask
但是,在JDK 9发行版中,不推荐使用这些类(不推荐使用的类可以在不推荐使用的列表中找到)。
正如其他人所提到的,不是它不被弃用但我个人总是使用ScheduledExecutorService
因为它提供了更丰富的API和更多的灵活性:
-
ScheduledExecutorService
允许您指定线程数,而Timer
始终使用单个线程。 - 可以使用
ThreadFactory
构造ScheduledExecutorService
,以允许控制除名称/守护程序状态之外的线程方面(例如,priority,ThreadGroup
,UncaughtExceptionHandler
)。 -
ScheduledExecutorService
允许以固定延迟和固定速率ScheduledExecutorService
任务。 -
ScheduledExecutorService
接受Callable
/Runnable
作为它的工作单元,这意味着你不需要专门使用它来子类化TimerTask
; 即您可以将相同的Callable
实现提交给常规ExecutorService
或ScheduledExecutorService
。
我认为这是一个误解。 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中它没有被弃用,因此不需要替代方案。