According to Java Concurrency in Practice and other sources of information main differences between Timer and ScheduledThreadExecutor are:
- Timer can be sensitive to changes in the system clock, ScheduledThreadPoolExecutor isn't
- Timer has only one execution thread, so long-running task can delay other tasks. ScheduledThreadPoolExecutor can be configured with any number of threads. Furthermore, you have full control over created threads, if you want (by providing ThreadFactory)
- Runtime exceptions thrown in TimerTask kill that one thread, thus making Timer dead :-( ... i.e. scheduled tasks will not run anymore. ScheduledThreadExecutor not only catches runtime exceptions, but it lets you handle them if you want (by overriding afterExecute method from ThreadPoolExecutor). Task which threw exception will be canceled, but other tasks will continue to run.
Calling
ScheduledExecutorService ex= Executors.newSingleThreadScheduledExecutor();
will give you a ScheduledExecutorService
with similar functionality to Timer
(i.e. it will be single-threaded) but whose access may be slightly more scalable (under the hood, it uses concurrent structures rather than complete synchronization as with the Timer
class). Using a ScheduledExecutorService
also gives you advantages such as:
- You can customize it if need be (see the
newScheduledThreadPoolExecutor()
or theScheduledThreadPoolExecutor
class) - The 'one off' executions can return results
- You can reschedule the same task inside run method using a ScheduledExecutorService, but not using a Timer. With Timer you get java.lang.IllegalStateException: Task already scheduled or cancelled