Запуск метода из объекта в другом потоке
У меня есть приложение LibGDX, в котором я рисую и поток для клиента или сервера. Соединения осуществляются с помощью Kryonet. Когда ваш оппонент создает что-то, сообщение получает линке так:
public void received(Connection con, Object object) {
TroopMessage tm = (TroopMessage)object;
fortress.map.addSoldier(tm.kind, true);
System.out.println("recieved");
connection = con;
}
Когда этот обратный вызов вызывается (и это правильно), я получаю "Контекст OpenGL не найден в текущем потоке". Я думаю, что он ищет объектную крепость в потоке MyClient. Я хочу вызвать fortress.map.addSoldier, который ссылается на объект, в настоящее время существующий в другом потоке.
public class Fortress extends Game implements ApplicationListener{
private OrthographicCamera camera;
private SpriteBatch batcher;
public static MyServer server;
public static MyClient client;
public static Map map;
[....]
Как я могу вызвать метод из другого потока?
заранее спасибо
1 ответ
В Libgdx вы можете использовать Gdx.app.postRunnable(Runnable r)
попросить основной поток рендеринга, имеющий контекст OpenGL, выполнить некоторый код. Посмотрите вики Libgdx о потоках приложений здесь: https://code.google.com/p/libgdx/wiki/ApplicationThreading
Как отмечают комментарии, как правило, объекты Java не принадлежат потоку. "Контекст OpenGL" является чем-то вроде исключения, поскольку только одному потоку разрешено вносить изменения в состояние OpenGL.