【问题标题】:How to know the condition at which a thread is "waiting" for?如何知道线程“等待”的条件?
【发布时间】:2019-05-19 02:12:53
【问题描述】:

我正在调试一个实时环境,我已经进行了一些线程转储。我看到很多线程都在“等待条件”;但是我怎么知道那个条件是什么?

下面是真实线程转储栈的sn-p:

"Uploader-pool-job-create-ca2d264a-51b3-4fa3-8113- 
f0f0aca47add-StreamThread-10-0_14" #140 daemon prio=5 os_prio=0 
tid=0x00007f006002b800 nid=0x18b waiting on condition 
[0x00007f004d9e1000]
 java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000002c20d4320> (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)

其他:

"Uploader-pool-job-create-ca2d264a-51b3-4fa3-8113- 
f0f0aca47add-StreamThread-3-0_16" #138 daemon prio=5 os_prio=0 
tid=0x00000000025da000 nid=0x189 waiting on condition 
[0x00007f004dbe3000]
java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000002c20d6690> (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)

在这些线程中,它说的是“等待条件”;但我无法解读线程等待的条件是什么?

--> 一般来说,有什么指导方针可以理解线程转储。

【问题讨论】:

    标签: java multithreading thread-dump


    【解决方案1】:

    这一切都在堆栈跟踪中 - ScheduledThreadPoolExecutoravailable 条件下是 awaiting

    private final Condition available;
    . . .
    
         available.awaitNanos(delay);   // ScheduledThreadPoolExecutor.java:1093
    

    换句话说,池中的线程处于空闲状态,等待更多工作。

    一般来说,堆栈跟踪会准确显示当前执行线程所在的 Java 文件名和行号(通常当线程等待时,最深的几级会太低级,所以只需继续向上链来找到最有意义的级别)。

    【讨论】:

    • 感谢您的解释,帮助理解。有没有办法以某种“简单”的方式理解线程转储(当然它带有经验和兴趣);但是对于不熟悉该主题的人,请提供任何提示?
    • 它带有经验。看起来像问题中的两个的堆栈跟踪是空闲线程,可以忽略(在 Java 应用程序中很多线程处于空闲状态是正常的)。关注在堆栈跟踪中提及您的包的线程以及处于“可运行”状态的线程。
    【解决方案2】:

    在我看来,他们正在等待获取锁。这种情况下的条件是:等待超时完成以尝试获取锁。

    java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000002c20d4320> (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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多