2014-10-17 78 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

相關問題