Запуск метода из объекта в другом потоке

У меня есть приложение 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.

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