我有一个应用程序,但它给您带来麻烦,它的某些线程仍处于WAITING
阶段,并且某些行为正常。所有这些线程基本上都具有相同的逻辑并运行多个实例。
重新启动应用程序后,应用程序将再次开始工作。下面是两个线程,一个线程处于TIMED_WAITING
中,一个线程永远处于WAITING
阶段,除非我重新启动该应用程序。
"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)
我不是Multithreading和线程转储方面的专家,因此寻求有关可能导致此行为的原因的输入。任何人都可以提供见识如何寻找导致问题的线索。
最佳答案
它看起来像是您的应用程序正在创建或正在使用库来创建计划的线程池执行程序。按照名称,线程池执行程序将工作委派给各个线程。当没有要完成的工作时,线程池执行程序线程将保持 hibernate 状态,直到提交此类工作为止。看起来这就是您在线程转储中看到的-线程池执行程序线程正在等待工作。
这是一个很好的介绍:
https://www.baeldung.com/thread-pool-java-and-guava
关于java - 除非重新启动应用程序,否则某些线程将始终处于“等待”状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61403905/