У меня есть приведенный ниже код (весь код здесь), который опрашивает очередь на наличие исполняемых объектов и автоматически паркуется, если очередь пуста.
public void waitAndDrain() throws InterruptedException {
throwIfInterrupted();
Runnable runnable = poll();
if (runnable == null) {
waiter = Thread.currentThread();
try {
while ((runnable = poll()) == null) {
LockSupport.park(this);
throwIfInterrupted();
}
} finally {
waiter = null;
}
}
do {
runQuietly(runnable);
} while ((runnable = poll()) != null);
}
И код, который отключает парковку
public void execute(Runnable runnable) {
add(runnable);
Object waiter = this.waiter;
if (waiter != SHUTDOWN) {
LockSupport.unpark((Thread) waiter); // no-op if null
} else if (remove(runnable) && rejectRunnableOnExecutor) {
throw new RejectedExecutionException();
}
}
Если отпарковки происходят последовательно, потеря разрешений не является проблемой, потому что код, который отпарковывает, также ставит в очередь исполняемые файлы, а код чтения паркует себя только в том случае, если очередь не пуста.
Прежде чем вы укажете мне на блок «else if» в коде распаковки, который выглядит подозрительно, позвольте мне отметить, что это не проблема, поскольку переменная «waitor» всегда установлена в SHUTDOWN здесь (может был частным методом, не обязательно должен быть общедоступным) после завершения цикла, опрашивающего очередь, поэтому, если он устанавливает ожидающий процесс в состояние SHUTDOWN, шансов на повторную парковку нет.
Однако наш клиент сообщил, что иногда приложение зависает с потоком парковки, ожидающим в припаркованном состоянии:
"Test worker" #1 prio=5 os_prio=0 cpu=68854.65ms elapsed=51528.48s tid=0x0000ffffb40311a0 nid=0x321d1c waiting on condition [0x0000ffffb99fb000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.15/Native Method)
- parking to wait for (a io.xxxx.stub.ClientCalls$ThreadlessExecutor)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
at io.xxxx.stub.ClientCalls$ThreadlessExecutor.waitAndDrain(ClientCalls.java:817)
at io.xxxx.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:166)
...
Подробнее здесь: https://stackoverflow.com/questions/798 ... definitely
Почему Locksupport.park зависает на неопределенный срок? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1765822033
Anonymous
У меня есть приведенный ниже код (весь код здесь), который опрашивает очередь на наличие исполняемых объектов и автоматически паркуется, если очередь пуста.
public void waitAndDrain() throws InterruptedException {
throwIfInterrupted();
Runnable runnable = poll();
if (runnable == null) {
waiter = Thread.currentThread();
try {
while ((runnable = poll()) == null) {
LockSupport.park(this);
throwIfInterrupted();
}
} finally {
waiter = null;
}
}
do {
runQuietly(runnable);
} while ((runnable = poll()) != null);
}
И код, который отключает парковку
public void execute(Runnable runnable) {
add(runnable);
Object waiter = this.waiter;
if (waiter != SHUTDOWN) {
LockSupport.unpark((Thread) waiter); // no-op if null
} else if (remove(runnable) && rejectRunnableOnExecutor) {
throw new RejectedExecutionException();
}
}
Если отпарковки происходят последовательно, потеря разрешений не является проблемой, потому что код, который отпарковывает, также ставит в очередь исполняемые файлы, а код чтения паркует себя только в том случае, если очередь не пуста.
Прежде чем вы укажете мне на блок «else if» в коде распаковки, который выглядит подозрительно, позвольте мне отметить, что это не проблема, поскольку переменная «waitor» всегда установлена в SHUTDOWN здесь (может был частным методом, не обязательно должен быть общедоступным) после завершения цикла, опрашивающего очередь, поэтому, если он устанавливает ожидающий процесс в состояние SHUTDOWN, шансов на повторную парковку нет.
Однако наш клиент сообщил, что иногда приложение зависает с потоком парковки, ожидающим в припаркованном состоянии:
"Test worker" #1 prio=5 os_prio=0 cpu=68854.65ms elapsed=51528.48s tid=0x0000ffffb40311a0 nid=0x321d1c waiting on condition [0x0000ffffb99fb000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.15/Native Method)
- parking to wait for (a io.xxxx.stub.ClientCalls$ThreadlessExecutor)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
at io.xxxx.stub.ClientCalls$ThreadlessExecutor.waitAndDrain(ClientCalls.java:817)
at io.xxxx.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:166)
...
Подробнее здесь: [url]https://stackoverflow.com/questions/79831835/why-does-locksupport-park-hang-indefinitely[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия