4

我用“Smack API”(XMPP)和“JAIN SIP”API(SIP)创建了一个 SIP-XMPP 网关。在我的应用程序中,我有三个线程:一个用于发送和接收 SIP,一个用于发送和接收 XMPP,一个“MessageQueue”用于存储传入消息并将它们重定向到相反的协议线程(传入 SIP -> 传出 XMPP,传入 XMPP - > 传出 SIP)

在此处输入图像描述

我目前正在我的 Windows 计算机上的 Eclipse 中运行网关,它完全可以工作。但是,如果我将 Eclipse 项目导出到 .jar 文件并在我的 Ubuntu 服务器上运行它,传入的消息将存储在消息队列中,但它们不会被重定向。

在此处输入图像描述

我在两个操作系统上运行具有相同 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();
4

1 回答 1

2

在这两个操作系统上,没有数据争用的无死锁程序应该正确运行。但是,操作系统非常不同,潜在的数据竞争或死锁可能会在一个操作系统上以比在另一个操作系统上更高的概率实现。

您的 prgram 正确且 Windows JVM 正确的可能性很小,但 UNIX JVM 存在错误。

但是,您最好确保您的程序确实是正确的。根据您所说,最好的猜测是它挂在 MessageQueue 线程或 sipThread 中。线程转储会告诉您更多信息。

于 2013-03-12T12:10:43.660 回答