从另一个Thread中的对象运行方法

时间:2013-05-26 13:24:47

标签: java multithreading opengl libgdx kryonet

我有LibGDX应用程序,我在其中绘制一个Thread for Client或Server。使用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 个答案:

答案 0 :(得分:4)

在Libgdx中,您可以使用Gdx.app.postRunnable(Runnable r)来询问具有渲染线程的主OpenGL上下文运行某些代码。请在此处查看有关应用程序线程的Libgdx维基:https://code.google.com/p/libgdx/wiki/ApplicationThreading

正如评论所指出的,通常Java对象不是由线程“拥有”的。 “OpenGL上下文”是一个例外,因为只允许一个线程对OpenGL状态进行更改。