处于WAITING状态的线程是否可以无限期等待

时间:2014-10-17 10:20:43

标签: java unix process corba

我们有一个基于多线程java的corba服务器应用程序,其中一个线程负责接收通过corba调用从其他应用程序发送的通知。

问题是通过负责发送的应用程序正在发送通知而未处理通知。

我使用jstack进行了几次线程转储,并在所有jstack中观察到处于相同WAITING状态的以下线程。我知道第一个由VC代理创建的工作线程的线程将发出第二个线程(NotificationConsumer线程)的信号。但我怀疑的是第一个线程(如下所示),它在一个对象监视器上处于WAITING状态,可能在一个unix进程上,该进程跨越了receiveBatchEvent()方法。如果unix进程变得不存在,那么线程会永远处于WAITING模式吗?

 "VBJ ThreadPool Worker id=4 se=unsecure scm=iiop_tp orb=419d05" daemon prio=3 tid=0x087c3c00 lwp=62 nid=0x3e in Object.wait() [0xea6ee000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.UNIXProcess.waitFor(UNIXProcess.java:115)
    - locked <0xf3495028> (a java.lang.UNIXProcess)
    at com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer.receiveBatchEvent(Unknown Source)
    at com.ericsson.nms.cif.na.server.SequencePushConsumerImpl.push_structured_events(SequencePushConsumerImpl.java:45)
    at org.omg.CosNotifyComm.SequencePushConsumerPOA._invoke(SequencePushConsumerPOA.java:60)
    at org.omg.CosNotifyComm.SequencePushConsumerPOA._invoke(SequencePushConsumerPOA.java:40)
    at com.inprise.vbroker.poa.POAImpl.invoke(Unknown Source)
    at com.inprise.vbroker.poa.ActivationRecord.invoke(Unknown Source)
    at com.inprise.vbroker.GIOP.GiopProtocolAdapter.doRequest(Unknown Source)
    at com.inprise.vbroker.IIOP.ServerProtocolAdapter.doRequest(Unknown Source)
    at com.inprise.vbroker.GIOP.GiopProtocolAdapter.dispatchMessage(Unknown Source)
    at com.inprise.vbroker.orb.TPDispatcherImpl$TPDispatcher.run(Unknown Source)
    at com.inprise.vbroker.orb.ThreadPool$PoolWorker.run(Unknown Source)    

-----------------------------------------------------------------------------------

 nid=0x28 in Object.wait() [0xeae9d000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
        at com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer$NotificationConsumer.synchronizedWait(Unknown Source)
        - locked <0xf32815a0> (a com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer$NotificationConsumer)
        at com.ericsson.nms.fm.ims.eim.plugin.NrmNotificationConsumer$NotificationConsumer.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
        - None  

1 个答案:

答案 0 :(得分:1)

等待锁定的Java线程将无限期地等待,直到锁定被释放,是的。它将等待Java锁,而不是直接涉及UNIX进程的任何东西。如果在某个地方产生synchronized块或方法产生UNIX进程,那么它将归结为该块或方法中的任何代码,如果UNIX进程死亡会发生什么,但肯定会可以让代码永远阻止。

如果您有类似

的内容
public class SomeClass {

    public synchronized void methodA() {
        while (true) {
            //do nothing
        }
    }

    public synchronized void methodB() {
        //do something useful
    }

}

并且一个线程在methodA()的实例上调用SomeClass,它将获取锁,并且永远不会释放它。如果第二个线程试图在同一个实例上调用methodB(),它将永远阻止,因为它无法获得锁定。

当你编写synchronized块时,它们应该尽可能短而快,这一点至关重要,并且应该非常仔细地检查它们以确保它们始终终止。< / p>