Запуск кода в главном потоке из дочернего потока

Я делаю простую многопользовательскую игру для двух игроков, используя Slick2D на Java. Я использую сокеты Java для создания объекта сервера и клиента. Они работают нормально, однако система обмена сообщениями работает в разных потоках (чтобы не блокировать основной поток). Все работает нормально, пока я не попытаюсь запустить код в главном классе из Runnable "MessageHandler", который выполняется в дочернем потоке. Дочерние потоки не имеют контекста OpenGL, поэтому некоторые вещи не будут работать. Есть ли способ вызвать метод в классе Main внутри MessageHandler, чтобы он выполнялся в основном потоке (возможно, в новом Runnable?)????

1 ответ

Лучшим решением вашей проблемы, вероятно, было бы использование потоков обработки сообщений для хранения сообщений в очереди (или некотором другом объекте списка). Таким образом, единственной задачей потока обработки сообщений является прослушивание сообщений и их сохранение. Попытка создать поток обработки сообщений для изменения объектов в главном потоке может вызвать много проблем с синхронизацией, если не сделать это очень осторожно, и я не думаю, что это необходимо для вашего случая.

Основной поток должен иметь ссылку на очередь, в которой хранятся эти сообщения. Затем вы можете запустить цикл (точно так же, как у вас есть цикл для рисования вашей игры), задача которого заключается в обработке этих сообщений. Если нет сообщений для обработки, основной поток ничего не делает и продолжает работу.

Также было бы неплохо синхронизировать список, чтобы он не записывался и не читался одновременно.

Другие вопросы по тегам