According to Java Concurrency in Practice:
Timercan be sensitive to changes in the system clock,ScheduledThreadPoolExecutorisn’t.Timerhas only one execution thread, so long-running task can delay other tasks.ScheduledThreadPoolExecutorcan be configured with any number of threads. Furthermore, you have full control over created threads, if you want (by providingThreadFactory).- Runtime exceptions thrown in
TimerTaskkill that one thread, thus makingTimerdead 🙁 … i.e. scheduled tasks will not run anymore.ScheduledThreadExecutornot only catches runtime exceptions, but it lets you handle them if you want (by overridingafterExecutemethod fromThreadPoolExecutor). 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.