Избежание исключений параллелизма в libgdx с потоками сервера / клиента

По сути, у меня есть настольное приложение LibGDX. У меня также есть сервер, к которому клиент подключается. Соединение с сервером выполняется в его личном потоке с ObjectInputStream.

Вот моя проблема: если элемент удален из, скажем, списка элементов на основании полученного пакета, я рискую получить исключение в потоке "Приложение LWJGL" java.util.ConcurrentModificationException, поскольку он не запускается в том же потоке,

Единственный известный мне вариант - запускать каждый полученный пакет на Gdx.app.postRunnable(). Но я знаю, что создание всех этих тем может быть действительно плохой идеей.

Есть ли способ, которым я мог бы связать поток ввода пакетов и поток LWJGL, чтобы избежать этих проблем без удержания основного потока opengl? Или postRunnable () не так опасен, как я думаю?

К сожалению, эту проблему трудно найти в Google, я попытался повторно вызвать помощь из IRC-канала справки LibGDX, но не смог получить ответ.

1 ответ

Я не думаю, что libGDX postRunnable() так тяжеловес, как ты боишься. Первый Runnable это не нить. Это просто объект с run метод. Таким образом, стоимость - это в основном только стоимость памяти при выделении объекта.

В приложении Libgdx каждый раз при запуске цикла рендеринга libgdx он выбирает список Runnable объекты, которые были поставлены в очередь postRunnable и выполняет run() метод на каждом по очереди. Затем он обрабатывает любые обработчики событий и затем вызывает обратный вызов приложения.

Если вы осторожны, чтобы не выделить новый Runnable Например, "публикация" Runnable должна быть относительно дешевой операцией (особенно по сравнению с получением сетевого трафика).

Тем не менее, вы, вероятно, хотите выполнять как можно больше обработки пакета изолированно (например, чтобы убедиться, что он завершен и правильно сформирован) в фоновом потоке, но как только вы захотите взаимодействовать с объектами, которые являются основными. рендеринг темы также взаимодействует с, вы, вероятно, лучше всего опубликовать Runnable, run обратный вызов не должен блокировать (поскольку вы заблокируете поток рендеринга), но он должен быть безопасным для взаимодействия с состоянием OpenGL изнутри обратного вызова.

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