Ответ
В 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) вместо блокировки потоков.