我有一个代码,我用java.util.Timer
来安排一个任务.我环顾四周,发现ExecutorService
也能做到.这里的问题是,你有没有用Timer
和ExecutorService
来安排任务,一种方法比另一种方法有什么好处?
还想判断是否有人使用了Timer
类,并遇到了ExecutorService
为他们解决的任何问题.
我有一个代码,我用java.util.Timer
来安排一个任务.我环顾四周,发现ExecutorService
也能做到.这里的问题是,你有没有用Timer
和ExecutorService
来安排任务,一种方法比另一种方法有什么好处?
还想判断是否有人使用了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
类.