Почему Locksupport.park зависает на неопределенный срок?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему Locksupport.park зависает на неопределенный срок?

Сообщение 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)
...


Подробнее здесь: https://stackoverflow.com/questions/798 ... definitely
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»