线程在监视器上等待

时间:2011-12-01 08:02:06

标签: java multithreading

我一直在讨论我正在公司工作的应用程序的性能改进。这个应用程序包含执行大量xml解析的计划任务。在某个小时,当许多此类任务被触发时,应用程序变慢。我一直在查看在一个这样的高峰时间收集的线程转储,看看能做什么是问题。但是对于这种运动是新手,我无法理解它.Below是线程转储的摘录。

"JMSThread(5)-7635" daemon prio=10 tid=0x000000004fb5b800 nid=0x71e in Object.wait() [0x0000000048de8000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00002aaabf41fe38> (a java.lang.Object)
    at EDU.oswego.cs.dl.util.concurrent.BoundedLinkedQueue.poll(BoundedLinkedQueue.java:253)
    - locked <0x00002aaabf41fe38> (a java.lang.Object)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor.getTask(PooledExecutor.java:723)
    at org.jboss.util.threadpool.MinPooledExecutor.getTask(MinPooledExecutor.java:106)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:747)
    at java.lang.Thread.run(Thread.java:619)
   Locked ownable synchronizers:
    - None


JMSThread(5)-7634" daemon prio=10 tid=0x000000004ed5c800 nid=0x716 in Object.wait() [0x0000000044eb2000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00002aaabf41fe38> (a java.lang.Object)
    at EDU.oswego.cs.dl.util.concurrent.BoundedLinkedQueue.poll(BoundedLinkedQueue.java:253)
    - locked <0x00002aaabf41fe38> (a java.lang.Object)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor.getTask(PooledExecutor.java:723)
    at org.jboss.util.threadpool.MinPooledExecutor.getTask(MinPooledExecutor.java:106)
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:747)
    at java.lang.Thread.run(Thread.java:619)
   Locked ownable synchronizers:
    - None

有几个这样的条目锁定并等待同一个对象。任何人都可以帮我理解他们的意思吗?这表明有什么问题吗?

2 个答案:

答案 0 :(得分:5)

这些条目表明存在等待BoundedLinkedQueue变为非空的线程。换句话说,工人正在等待有人给他们做点什么。如果不了解应用程序的架构,就无法确定这是否表明存在问题。

如果您希望这些线程繁忙,您需要查看为什么应该向队列添加任务的人不会足够快地添加它们以使工作人员忙碌。

答案 1 :(得分:1)

从我看到的,有两种可能的解释:1。你的生产者不够快,不能将东西插入队列,所以消费者必须等到他们得到了什么。这表明您的生产商在某些情况下会减速。 2.你的队列有问题,生产者在把任务从队列中拿出来的时间太长了。

关于第二点,可能有一个解决方案。从它的外观来看,你有自己的BoundedQueue实现,它使用一个Object来调用synchronized,以强制执行线程安全。您可能想要检查是否可以使用BlockingQueue包中提供的concurrency之一(例如,有LinkedBlockingQueue)。这些队列也可以绑定,但设计用于多线程环境。