Dokładność snu sprowadza się do systemu operacyjnego. Jeśli chcesz większej dokładności, możesz użyć innego systemu operacyjnego. Inne podejście polega na tym, że nie śpij, zamiast tego możesz zająć dużo czasu. Lub możesz spać na przykład 45 ms i zajętego czekać przez 5 ms.
Jeśli masz zadanie, które musisz uruchomić 20 razy na sekundę, lepiej jest śledzić, kiedy zadania powinny być wykonywane dalej i uruchomić je w tym czasie (zamiast czekać przez określony czas), co robisz między snami również zajmie trochę czasu.
BTW To właśnie robi dla Ciebie ScheduledExecutorService.scheduleAtFixedRate.
Może spać pomiędzy zadaniami z dokładnością do mikrosekundy (zakładając, że system operacyjny obsługuje to), ale stara się nie dryfować.