Если у вас есть if
внутри цикла while
, который проверяет прошедшее время, то у вас не будет ровно 20 секунд, но не менее 20 с.Самый простой способ - что-то вроде этого:
LocalDateTime then = LocalDateTime.now();
while (true) {
// logic
if (ChronoUnit.SECONDS.between(then, LocalDateTime.now()) >= 20) break;
}