Executors.newSingleThreadScheduledExecutor(this);
uses a ScheduledThreadPoolExecutor
under the hood. In the JavaDocs for that class it states:
Delayed tasks execute no sooner than they are enabled, but without any real-time guarantees about when, after they are enabled, they will commence. Tasks scheduled for exactly the same execution time are enabled in first-in-first-out (FIFO) order of submission.
As n1ckolas has pointed out, you are going to have difficulty trying to get this kind of precision in pure Java.
However, there are some things you can try which might be more accurate than a ScheduledThreadPoolExecutor although their accuracy will be dependent on the OS, the hardware, etc.