В чем разница между припаркованной нитью и ожидающим потоком в java? У меня есть дамп ядра jboss и анализ его показывает много припаркованных потоков.
Java припаркованная нить
Ответ 1
Посмотрите Javadoc метод park()
:
Отключает текущий поток для целей планирования потоков, если только разрешение доступно. Если разрешение доступно, оно потребляется и вызов немедленно возвращается; в противном случае текущая нить становится отключен для целей планирования потоков и находится в состоянии покоя, пока один из происходит три вещи:
Некоторый другой поток вызывает unpark с текущей нитью как цель; или какой-либо другой поток прерывает текущий поток; или вызов ложно (то есть без причины) возвращается. Этот метод не сообщите, какой из них вызвал метод возврата. Звонящие должны перепроверьте условия, в результате которых нить припарковалась в первом место. Вызывающие могут также определять, например, статус прерывания потока после возврата.
Итак, припаркованная нить - это поток, заблокированный с помощью LockSupport.park()
.
Ответ 2
В Java припаркованный поток, LockSupport.park()
методом LockSupport.park()
является ожидающим потоком (в Thread.state.WAITING
).
См. Java Doc для Thread.state.WAITING.
Есть 3 способа заставить поток быть в состоянии ОЖИДАНИЯ:
- Object.wait без тайм-аута
- Присоединиться без тайм-аута
- LockSupport.park
Поток в состоянии ожидания ожидает, пока другой поток выполнит определенное действие.
Например, поток, вызвавший Object.wait() для объекта, ожидает, пока другой поток вызовет Object.notify() или Object.notifyAll() для этого объекта. Поток, вызвавший Thread.join(), ожидает завершения указанного потока.
Ответ 3
LockSupport - класс принимает базовые примитивы блокировки потоков для создания блокировок и других классов синхронизации.
Метод park() отключает текущий поток для целей планирования потоков, если разрешение не доступно.
unpark (Thread thread) предоставляет разрешение для данного потока, если он еще не был доступен.
Используйте его как:
в конце концов { LockSupport.unpark(резьба); }