If you have 10 years of time then perhaps by that time, there will be a completeley pause-free garbage collector as part of vanilla Java, which would be nice – but at this point it is speculation. Java 11’s ZGC certainly goes into that direction this being said, though I don’t know if that approach could one day lead to a 100% pause-free GC that would leave such timing threads entirely alone.
I think you can get a fair sub-millisecond measurement with the method described by Patrick - you won’t get a precision on the nanosecond level, but on the granularity of a ms you should be fine. You’d need to run this in a dedicated thread though.
It’s a bit hard to say more without knowing the context. I suppose another issue you might be facing is that even if the scheduler is perfectly precise, whether the execution of whatever is scheduled can happen at a latency that is acceptable (i.e. in less than a millisecond).