2014-10-17 82 views
0

我们有一个基于java的多线程corba服务器应用程序,其中一个线程负责接收通过corba调用从其他应用程序发送的通知。处于WAITING状态的线程是否可以无限期等待

问题是通知没有通过负责发送的应用程序处理发送通知。

我已经采取了几个使用jstack的线程转储,并在所有jstacks中观察到相同的WAITING状态下的线程。我知道由VC代理创建的第一个线程是一个工作线程,它将发出第二个线程(NotificationConsumer线程)的信号。但是我的疑问是,第一个线程(下面首先显示)处于WAITING状态,可能在从receiveBatchEvent()方法跨越的unix进程的对象监视器上。因为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

正在等待锁定的Java线程将无限期地等待,直到释放锁定为止。它将等待Java锁,而不是直接与UNIX进程相关的任何事情。如果在某个产生UNIX进程的地方有一个​​块或方法,那么它将归结为该块或方法中的任何代码,以确定如果UNIX进程死亡会发生什么情况,但是肯定有可能代码只是永远阻止。

如果您有类似

public class SomeClass { 

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

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

} 

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

当你编写​​块时,它们应该尽可能短且尽可能快,并且应该仔细检查它们以确保它们始终终止,这一点非常重要。

+0

嗨,感谢您的回复。我还不清楚的是,我们是否可以从第一个线程的栈(VBJ ThreadPool Worker id = 4 se = unsecure scm = iiop_tp orb = 419d05“daemon prio = 3 tid = 0x087c3c00 lwp = 62 nid = 0x3e)不管它处于无限期WAITING状态,在出现问题的时间间隔为1小时的时间间隔中出现的几个jstack中出现相同的线程堆栈 – 2014-10-17 13:15:41

+0

@ViswamDevireddyvijay您无法从该输出中推断出,没有。能够告诉你它是否会无限期地等待,等待一个锁被释放;但是你需要查看代码来确定带锁的代码是否可以释放它。 – 2014-10-17 13:28:38

相关问题