Какие основные причины остановки (паузы) потока выполнения в Java?

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

Ответ

Поток в Java может быть приостановлен или заблокирован в нескольких сценариях:

  1. Явная синхронизация:

    synchronized(lockObject) {
        // Поток блокируется здесь, если другой поток владеет lockObject
    }
  2. Ожидание по условию (монитор объекта):

    object.wait(); // Поток освобождает монитор и ждет notify()/notifyAll()
  3. Ожидание завершения другого потока:

    thread.join(); // Текущий поток ждет завершения потока 'thread'
  4. Блокирующий ввод-вывод (I/O):

    socketInputStream.read(); // Поток блокируется, пока данные не станут доступны
  5. Проблемы параллелизма:

    • Взаимная блокировка (Deadlock): Циклическая зависимость блокировок.
    • Голодание (Starvation): Поток не может получить доступ к ресурсу.
    • Активное ожидание (Livelock): Потоки "работают", но не прогрессируют.
  6. Управляемые паузы:

    Thread.sleep(1000); // Поток приостанавливается на 1 секунду

Инструменты для диагностики: jstack для снятия дампа потоков, профилировщики (VisualVM, Async Profiler), логирование состояния потоков.