我有一个代码,我用java.util.Timer来安排一个任务.我环顾四周,发现ExecutorService也能做到.这里的问题是,你有没有用TimerExecutorService来安排任务,一种方法比另一种方法有什么好处?

还想判断是否有人使用了Timer类,并遇到了ExecutorService为他们解决的任何问题.

推荐答案

根据Java Concurrency in Practice:

  • Timer可以对系统时钟的变化敏感,而ScheduledThreadPoolExecutor则不是.
  • Timer只有一个执行线程,因此长时间运行的任务可能会延迟其他任务.ScheduledThreadPoolExecutor可以配置任意数量的线程.此外,如果需要,您可以完全控制创建的线程(通过提供ThreadFactory).
  • TimerTask中抛出的运行时异常会杀死这一个线程,从而导致Timer死亡:-(…即,计划任务将不再运行.ScheduledThreadExecutor不仅捕获运行时异常,还允许您根据需要处理它们(通过从ThreadPoolExecutor重写afterExecute方法).引发异常的任务将被取消,但其他任务将继续运行.

如果你可以使用ScheduledThreadExecutor而不是Timer,那么就这样做.

还有一件事...虽然Java 1.4库中没有ScheduledThreadExecutor,但是有一个Backport of JSR 166 (java.util.concurrent) to Java 1.2, 1.3, 1.4,它有ScheduledThreadExecutor类.

Java相关问答推荐

如何在Javascript中设置文本区域圆角的样式

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

计算两个浮点数之间的距离是否对称?

Bean定义不是从Spring ApplationConext.xml文件加载的

Java中将文本拆分为数字或十进制数字和字符串

如何从日志(log)行中删除包名称?

在向WebSphere中的文档添加元素时iText挂起

Java构造函数分支

如何仅使用键/ID的一部分(组合)高效地返回映射值?

将JSON字符串转换为Java类

为什么有两种实现来检索数组类的组件类型?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

舰队运行配置Maven版本

A.ForEach与For(类型a:集合)

为什么我不能建立输入/输出流?Java ServerSocket

为什么相同的数据条码在视觉上看起来不同?

在Java中将对象&转换为&q;HashMap(&Q)

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

如何使用Jackson读取以方括号开头的JSON?

为什么 log4j 过滤器在appender中不起作用