Java припаркованный поток

В чем разница между припаркованным потоком и ожидающим потоком в Java? У меня есть дамп ядра jboss, который анализирует множество припаркованных потоков.

2 ответа

Решение

Посмотрите на Javadoc park() метод:

Отключает текущий поток для целей планирования потока, если разрешение не доступно. Если разрешение доступно, то оно используется, и вызов немедленно возвращается; в противном случае текущий поток становится отключенным для целей планирования потока и остается неактивным, пока не произойдет одно из трех:

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

Таким образом, припаркованный поток является потоком, заблокированным с помощью LockSupport.park(),

И park(), и wait() приведут к отключению потока. Снова сделать отключенный поток активным зависит от того, как он был отключен.

Поток, который был отключен вызовом LockSupport.park() останется отключенным до:

  • некоторые другие вызовы потоков unpark(), или
  • некоторые другие вызовы потоков interrupt(), или
  • "вызов ложно (то есть без причины) возвращается"

Поток, который был отключен вызовом Object wait(), что эквивалентно вызову wait(0) - останется отключенным до:

  • некоторые другие вызовы потоков notify() или notifyAll(), или
  • некоторые другие вызовы потоков interrupt() в отключенном потоке

В Java припаркованный поток путем вызоваLockSupport.park() метод - это ожидающий поток (в Thread.state.WAITING).

См. Документ Java для Thread.state.WAITING.

Есть 3 способа перевести поток в статус WAITING:

  1. Object.wait без тайм-аута
  2. Thread.join без тайм-аута
  3. LockSupport.park

Поток в состоянии ожидания ожидает, пока другой поток выполнит определенное действие.

Например, поток, который вызвал Object.wait() для объекта, ожидает, пока другой поток вызовет Object.notify() или Object.notifyAll() для этого объекта. Поток, вызвавший Thread.join(), ожидает завершения указанного потока.

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

LockSupport - класс использует базовые примитивы блокировки потоков для создания блокировок и других классов синхронизации.

Метод park() отключает текущий поток для целей планирования потока, если только разрешение не доступно.

unpark (Thread thread) делает доступным разрешение для данного потока, если оно еще не было доступно.

Используйте это как:
finally {LockSupport.unpark (thread); }

Другие вопросы по тегам