java - 除非重新启动应用程序,否则某些线程将始终处于“等待”状态

标签 java multithreading

我有一个应用程序,但它给您带来麻烦,它的某些线程仍处于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/

相关文章:

Java:不能引用非最终变量

java - URL 中的复制服务器名称

c# - 基本线程问题

java - 如果我从 synchronized block 返回,什么时候释放锁?

c# - 一个进程中的线程数量正常吗?

Java String - 包含被 'offset' 隐藏的部分

java - RabbitMQ队列问题。消息监听器不消费前两条消息

java - 序列化一个对象时未找到序列化程序

java - 避免在 CyclicBarrier 上耍花招的想法

Linux:信号对多线程的影响