Блокированные и ожидающие потоки Java

Блокированные и ожидающие потоки JavaКогда поток заблокирован или находится в состоянии ожидания, он временно не активен. Он не выполняет никакого кода и потребляет минимум ресурсов. На планировщике потоков лежит обязанность повторно активизировать его. Подробности зависят от того, как было достигнуто неактивное состояние.

  • Когда поток пытается получить внутренний объект блокировки(но не Lock из библиотеки java.util.concurrent), он становится блокированным. Поток разблокируется, когда все остальные потоки освобождают блокировку и планировщик потоков позволяет данному потоку захватить его.
  • Когда поток ожидает другого потока для уведомления планировщика о наступлении  некоторого условия, он входит в состояние ожидания. Это происходит вызовом методов Object.wait() или Thread.join(), либо ожиданием Lock или Condition в библиотеке java.util.concurrent. На практике разница между блокированным состоянием и состоянием ожидания не существенна.
  • Несколько методов принимают параметр — длительность таймаута. Их вызов водит поток в состояние временного ожидания. Это состояние сохраняется до тех пор, пока либо не истечет указанное время таймаута, либо не будет получено соответствующие уведомление. К методам с таймаутом относятся Object.wait(), Thread.join(), Lock.tryLock() и Condition.await().

Когда поток заблокирован или находится в состоянии ожидания(или, конечно, когда он завершается), то другой поток планируется к запуску. Когда поток повторно активизируется(например, по истечении таймаута или когда ему удается захватить блокировку), то планировщик сравнивает его приоритет с приоритетом выполняющихся в данный момент поток. Если приоритет данного потока ниже, он приостанавливается и запускается новый поток.