Timer uses System.currentTimeMillis() to determine the next execution of a task.
However ScheduledThreadPoolExecutor uses System.nanoTime().
Also nanoTime() method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time.
System.currentTimeMillis() is sensitive to system clock
System.nanoTime() is not sensitive to system clock as it measures the time elapsed.
Java Documentation: System.nanoTime()
This method can only be used to measure elapsed time and is not
related to any other notion of system or wall-clock time. The value
returned represents nanoseconds since some fixed but arbitrary time
(perhaps in the future, so values may be negative).