Java多线程在Windows中工作,但不在Ubuntu中

Java多线程在Windows中工作,但不在Ubuntu中

问题描述:

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

enter image description here

我目前运行在Eclipse中网关我的Windows电脑上,它完全适用。但是,如果我将Eclipse项目导出为.jar文件并在我的Ubuntu服务器上运行它,则传入消息将存储在消息队列中,但它们不会重定向。

enter image description here

我正在与这两个操作系统在同一个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(); 
+0

很难说。应用程序是否在后续消息中悬挂?如果是这样,你应该挂一个线程转储。 – Ingo 2013-03-12 11:54:39

+1

您可能会遇到线程安全问题,根据环境条件(性能等)可能会出现不同的问题。您在MessageQueue类中使用并发队列类吗?另外,为什么你将2个工作线程传递给你的队列? – cmevoli 2013-03-12 12:07:27

+1

Java线程不需要*时间片。也就是说,调度程序不需要预先暂停一个线程来给另一个运行的机会。也许你的程序设计或实现假设线程时间片? – Raedwald 2013-03-12 13:21:32

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

您的prgram是正确的,并且Windows JVM是正确的,但UNIX JVM有一个错误。

但是,你最好确保你的程序确实是正确的。从你所说的,最好的猜测是它挂在MessageQueue线程或sipThread中。线程转储将告诉你更多。

+0

我结束了在Windows服务器而不是Ubuntu服务器上运行我的应用程序。我不确定它是否是我的应用程序,或者Java JDK版本是问题的根源,但是我读到Windows中的线程稍微轻量级,并且在单进程应用程序中可能比在UNIX中稍好一些。我会做更多的研究,也许会对我的申请做一些更正 – ClydeFrog 2013-03-12 20:12:14