在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);
}
连接正常但该方法永远不会执行。我该如何解决这个问题?
答案 0 :(得分:1)
jMonkeyEngine使用swing样式的线程模型,其中有一个渲染线程可以完成所有工作。必须从该渲染线程完成对场景图的任何更改。
要进入渲染线程,您可以实现AppStates
,Controls
或者您可以enqueue
Callable
,然后以类似的方式在渲染线程上执行Swing的invokeLater
。
您发布的代码片段看起来是正确的,因此假设m是您正在运行的jME3 SimpleApplication,那么m.enqueue()将导致下次在渲染循环周围执行入队的可调用对象(即在下一帧的开头)
如果你没有看到它被执行,那么:
逐步调试调试器中的代码和/或添加调试语句(例如removeContainersFromMaritime
中的断点以查看它是否实际被调用应该允许您缩小范围。
答案 1 :(得分:0)
我可能会遗漏一些东西,但m.enqueue(...)中的“m”是什么? 我猜它是某种执行器服务,它可能就是问题所在。
您可以尝试改为:
new Thread() {public void run()
{
m.removeContainersFromMaritime(containerId);
}}.start();
至少会告诉你问题是来自“m”作为遗嘱执行人。