Louis:
It seems both of them can execute tasks on schedule and in a separate thread.
Timer uses only a single thread for the execution of all its tasks. So, if you have a task that takes a long time to process, all the subsequent tasks will be delayed.
On the other hand, you can configure the number of threads in a instance of ScheduledExecutorService. Since, the number of threads are more than one so the dependency of scheduling one task over the completion of another is reduced.
This is what the javadoc of ScheduledThreadPoolExecutor says: (this may clarify your doubt further)
This class is preferable to Timer when multiple worker threads are needed, or when the additional flexibility or capabilities of ThreadPoolExecutor (which this class extends) are required.