Что вы ожидаете?
Если вы перейдете в спящий режим, то после того, как ваш процесс снова запустится, ему придется ждать, пока планировщик потока не запланирует его снова.
Я имею в виду, что если вы засыпаете на 50 секунд, это не означает, что ваш процесс будет запущен ровно через 50 секунд. Поскольку после этого он запускается и работает, ему придется ждать, чтобы быть запланированным для процессора, который занимаетдополнительное время плюс время, которое у вас есть для переключения контекста.
Вы ничего не можете сделать, чтобы контролировать его, поэтому вы не можете иметь точность, которую говорите.
Для вашего случая я бы предложил вращающуюся петлю.
long now = System.currentTimeMillis();
while(now < expectedElapsedTime){
now = System.currentTimeMillis();
}