Ответ
Поток в Java может быть приостановлен или заблокирован в нескольких сценариях:
-
Явная синхронизация:
synchronized(lockObject) { // Поток блокируется здесь, если другой поток владеет lockObject } -
Ожидание по условию (монитор объекта):
object.wait(); // Поток освобождает монитор и ждет notify()/notifyAll() -
Ожидание завершения другого потока:
thread.join(); // Текущий поток ждет завершения потока 'thread' -
Блокирующий ввод-вывод (I/O):
socketInputStream.read(); // Поток блокируется, пока данные не станут доступны -
Проблемы параллелизма:
- Взаимная блокировка (Deadlock): Циклическая зависимость блокировок.
- Голодание (Starvation): Поток не может получить доступ к ресурсу.
- Активное ожидание (Livelock): Потоки "работают", но не прогрессируют.
-
Управляемые паузы:
Thread.sleep(1000); // Поток приостанавливается на 1 секунду
Инструменты для диагностики: jstack для снятия дампа потоков, профилировщики (VisualVM, Async Profiler), логирование состояния потоков.