Какие существуют способы реализовать паузу или ожидание в Java?

«Какие существуют способы реализовать паузу или ожидание в Java?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java есть несколько механизмов для приостановки выполнения потока, каждый со своей областью применения.

1. Thread.sleep(long millis)

Приостанавливает текущий поток на заданное время. Не отпускает блокировки (мониторы).

try {
    // Приостановить поток на 2 секунды
    Thread.sleep(2000);
} catch (InterruptedException e) {
    // Восстановление флага прерывания — важная практика!
    Thread.currentThread().interrupt();
}

2. Object.wait(long timeout)

Вызывается внутри блока synchronized. Освобождает монитор объекта, позволяя другим потокам войти в синхронизированный блок. Поток пробуждается по notify()/notifyAll() или истечении таймаута.

synchronized (lockObject) {
    try {
        lockObject.wait(5000); // Ждать до 5 секунд
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

3. ScheduledExecutorService

Предпочтительный способ для планирования отложенных или периодических задач. Управляет пулом потоков.

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Выполнить задачу через 3 секунды
ScheduledFuture<?> future = scheduler.schedule(() -> {
    System.out.println("Задача выполнена");
}, 3, TimeUnit.SECONDS);
// ...
scheduler.shutdown(); // Важно: завершить сервис

4. TimeUnit для удобства

TimeUnit.SECONDS.sleep(1); // Более читаемая альтернатива Thread.sleep(1000)
Краткое сравнение: Метод Освобождает монитор? Использование
Thread.sleep() Нет Простая пауза в работе потока.
Object.wait() Да Синхронизация между потоками (wait/notify).
ScheduledExecutorService Н/Д Планирование задач в пуле потоков.

Для операций ввода-вывода используйте асинхронные API (NIO, CompletableFuture) вместо блокировки потоков.