我创build了一个带有“Smack API”(XMPP)和“JAIN SIP”API(SIP)的SIP-XMPP网关。 在我的应用程序中,我有三个线程:一个用于发送和接收SIP,一个用于发送和接收XMPP,一个用于存储传入消息的“MessageQueue”,并将它们redirect到相反的协议线程(传入SIP – >传出XMPP,传入XMPP – >传出SIP)
我目前在我的Windows电脑上运行Eclipse中的网关,它完全工作。 但是,如果我将Eclipse项目导出到一个.jar文件并在我的Ubuntu服务器上运行它,传入的消息将被存储在消息队列中,但它们不会被redirect。
我在两个操作系统上都使用相同的JDK版本“1.6.0_14”运行应用程序。 我已经读过Java中的线程在Windows和UNIX系统中略有不同。 我做错了什么或线程运行不同的待定在什么操作系统上运行?
MessageQueue queue = new MessageQueue(); XMPPMessageListener xmppThread = new XMPPMessageListener(); SIPThread sipThread = new SIPThread(); new Thread(queue).start(); sipThread.setQueue(queue); xmppThread.setQueue(queue); queue.setXMPPThread(xmppThread); queue.setSipThread(sipThread); new Thread(xmppThread).start(); new Thread(sipThread).start();
在这两个操作系统上,没有数据竞争的无死锁程序应该正常工作。 但是,操作系统是不同的,一个潜在的数据竞争或死锁可能会在一个操作系统上实现比另一个更高的可能性。
你的prgram是正确的,并且Windows JVM是正确的,但是UNIX JVM有一个bug。
不过,你最好确保你的程序确实是正确的。 从你所说的,最好的猜测是挂在MessageQueue线程或者sipThread中。 线程转储将告诉你更多。