Java Timer vs ExecutorService?
executorservice, java, scheduled-tasks, scheduling, timer
Solution
According to Java Concurrency in Practice:
- `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.
If you can use `ScheduledThreadExecutor` instead of `Timer`, do so.
One more thing... while `ScheduledThreadExecutor` isn't available in Java 1.4 library, there is a Backport of JSR 166 (`java.util.concurrent`) to Java 1.2, 1.3, 1.4, which has the `ScheduledThreadExecutor` class.
Problem
I have code where I schedule a task using `java.util.Timer`. I was looking around and saw `ExecutorService` can do the same. So this question here, have you used `Timer` and `ExecutorService` to schedule tasks, what is the benefit of one using over another? Also wanted to check if anyone had used the `Timer` class and ran into any issues which the `ExecutorService` solved for them.