关于多线程编程的赛车场景

时间:2011-10-08 23:56:44

标签: java multithreading swing thread-safety

我正在设计一个网络游戏,所以我有一个客户端,一个监听线程来自服务器的东西,服务器也有一个监听线程,它正在收听来自客户端的消息。

在其中一个客户面板中,我执行以下操作:
向服务器发送一些消息,并在来自同一地方的两行代码再次使用其他功能执行此操作 结果是一系列代码有时运行良好,有时会抛出异常。 在客户端面板上的一个发送功能的行上抛出异常。

注意:如果我在两个发送之间放置Thread.sleep(1000);,则不会抛出任何异常,但正如您所知,这是一个糟糕的解决方案..
*
将信息发送到唯一的服务器线程的两个函数是:

ClientCommunicationThread.UpdateServerOfTimeEnded  
ClientCommunicationThread.SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer

我该如何解决这个问题 感谢。

这是堆栈跟踪:

java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
    at java.io.DataOutputStream.writeInt(DataOutputStream.java:181)
    at GUI.ClientCommunicationThread.UpdateServerOfTimeEnded(ClientCommunicationThread.java:850)
    at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:312)
    at javax.swing.Timer.fireActionPerformed(Timer.java:271)
    at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
    at java.io.DataOutputStream.writeInt(DataOutputStream.java:180)
    at GUI.ClientCommunicationThread.SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer(ClientCommunicationThread.java:824)
    at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:325)
    at javax.swing.Timer.fireActionPerformed(Timer.java:271)
    at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

1 个答案:

答案 0 :(得分:2)

假设:发生这种情况是因为您正在为两个函数使用相同的套接字对象,并且这两个函数都希望将某些内容写入套接字输出流。我希望我是对的。基于此我的go将使用同步。下面的链接将指导您通过一些锁定对象的方式,以便两个不同的线程无法一起访问同一个对象。完成后,您可以创建隐式锁定而不是释放。 :)当然,您可以创建两个不同的线程来调用两个不同的函数。 (更安全......)

链接:Intrinsic Locks and Synchronization

希望这会帮助你解决。