Пауза в потоке в Java
Иногда потоку нужно временно уступить процессор: имитация
задержки сети, периодический опрос или простая демонстрация
параллелизма. Статический метод Thread.sleep
блокирует только текущий поток на указанное число
миллисекунд.
Во время сна поток не потребляет CPU, но остаётся живым. Пробуждение не гарантирует мгновенный возврат к работе: планировщик может включить поток чуть позже заданного интервала.
Пауза на 200 миллисекунд внутри задачи:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
try {
Thread.sleep(200);
System.out.println("awake");
} catch (InterruptedException e) {
System.out.println("interrupted during sleep");
Thread.currentThread().interrupt();
}
});
worker.start();
worker.join();
}
}
sleep бросает InterruptedException, если
другой поток прервал спящий. После перехвата принято
снова выставить флаг через
Thread.currentThread().interrupt(), чтобы
вызывающий код видел прерывание.
Тот же смысл через TimeUnit для читаемости:
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(50);
System.out.println("tick");
}
}
Здесь спит главный поток. В worker ту же запись можно
подставить вместо Thread.sleep.
Запустите поток, который спит 100 мс и печатает
"late". В main сразу после start
выведите "early" и дождитесь worker. Проверьте, что early всегда
идёт перед late.