Избежание исключений параллелизма в 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 изнутри обратного вызова.