Гоночный сценарий относительно многопоточного программирования - PullRequest
2 голосов
/ 09 октября 2011

Я разрабатываю сетевую игру, поэтому у меня есть клиент с одним потоком прослушивания вещей, поступающих с сервера, а также на сервере есть поток прослушивания, который прослушивает сообщения от клиента.

В одной из панелей клиента я делаю следующее:
отправив какое-то сообщение на сервер и после двух строк кода из того же места, сделайте это снова с другой функцией.
Результатом является запуск кода, который иногда работает хорошо, а иногда выдает исключение. Исключение выдается в строке одной из отправляющих функций на клиентской панели.

Примечание: если я помещу 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 Ответ

2 голосов
/ 09 октября 2011

Предположение: это происходит потому, что вы используете один и тот же объект сокета для обеих функций, и обе функции хотят записать что-то в поток вывода сокета.Я надеюсь, что я прав в этом.Исходя из этого, я бы использовал синхронизацию.Приведенная ниже ссылка проведет вас через некоторые способы блокировки объектов, чтобы два разных потока не могли получить доступ к одному и тому же объекту вместе.Вы создаете неявную блокировку, а затем освобождаете, когда с ней покончено.:) И, конечно, вы можете создать два разных потока для вызова двух разных функций.(Более безопасный ...)

Ссылка: Внутренние блокировки и синхронизация

Надеюсь, это поможет вам решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...