JME中的线程不起作用

时间:2013-12-13 12:17:15

标签: java multithreading sockets jmonkeyengine

在JME中我尝试使用线程,但是当我运行程序时,函数永远不会启动。

我有一个正在收听Netbeans输入的服务器套接字。

监听

while (isRunning) {
            //Reads and prints the input
            String receivedString = (String) in.readObject();

            System.out.println(receivedString);

            String[] parts = receivedString.split(";");

            if(parts[0].equals("craneCon"))
            {
                final int containerId = Integer.parseInt(parts[1]);
                m.enqueue(new Callable<Spatial>(){
                    public Spatial call() throws Exception{                        
                        m.removeContainersFromMaritime(containerId);
                        return null;
                    }
                });
            }

所以主要有函数removeContainersFromMaritime

public void removeContainersFromMaritime(final int idContainer)
    {
        Node container = Maritime.listOfContainers.get(idContainer);

        martime.detachChild(Maritime.listOfContainers.get(idContainer));
        seagoingcrane.attachChild(Maritime.listOfContainers.get(idContainer));

        container.setLocalTranslation(0,5,0);
        System.out.println(Maritime.listOfContainers.get(0).getWorldTranslation().z);

    }

连接正常但该方法永远不会执行。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

jMonkeyEngine使用swing样式的线程模型,其中有一个渲染线程可以完成所有工作。必须从该渲染线程完成对场景图的任何更改。

要进入渲染线程,您可以实现AppStatesControls或者您可以enqueue Callable,然后以类似的方式在渲染线程上执行Swing的invokeLater

您发布的代码片段看起来是正确的,因此假设m是您正在运行的jME3 SimpleApplication,那么m.enqueue()将导致下次在渲染循环周围执行入队的可调用对象(即在下一帧的开头)

如果你没有看到它被执行,那么:

  1. 您的应用程序未运行
  2. 您创建了多个应用程序并将其排入错误的应用程序
  3. 代码实际上正在运行,你只是认为它不是。
  4. 逐步调试调试器中的代码和/或添加调试语句(例如removeContainersFromMaritime中的断点以查看它是否实际被调用应该允许您缩小范围。

答案 1 :(得分:0)

我可能会遗漏一些东西,但m.enqueue(...)中的“m”是什么? 我猜它是某种执行器服务,它可能就是问题所在。

您可以尝试改为:

new Thread() {public void run()
{
    m.removeContainersFromMaritime(containerId);
}}.start();

至少会告诉你问题是来自“m”作为遗嘱执行人。