Некоторые потоки остаются в состоянии ожидания до тех пор, пока приложение не будет перезапущено - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть приложение, и оно доставляет проблемы, некоторые его потоки остаются в стадии WAITING, а некоторые ведут себя нормально. Все эти потоки в основном имеют одинаковую логику c и запускают несколько экземпляров.

После перезапуска приложения приложения снова начинают работать. Ниже приведены два потока, один из которых находится в TIMED_WAITING, а другой - в WAITING stage навсегда, если только я не перезапущу приложение.

"Worker-pool-app-c4738262-bfec-47fb-9741-cc8712084508-StreamThread-4-0_14" #62 daemon prio=5 os_prio=0 tid=0x00007f766d71f800 nid=0x11b waiting on condition [0x00007f760af59000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c2e0b690> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)




"Worker-pool-app-c4738262-bfec-47fb-9741-cc8712084508-StreamThread-2-0_22" #61 daemon prio=5 os_prio=0 tid=0x00007f76500b5800 nid=0xea waiting on condition [0x00007f760b05a000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c25bc550> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

Я не специалист по многопоточности и дампам потоков , следовательно, ищет входные данные о том, что может быть причиной такого поведения. Может кто-нибудь дать представление о том, как искать подсказку, которая вызывает проблему.

1 Ответ

1 голос
/ 24 апреля 2020

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

Вот хорошее введение: https://www.baeldung.com/thread-pool-java-and-guava

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...