public static void moveTo(Coordinate destination) {
changeState(State.NAVIGATION);
controlPnl.addRemote(Remote.createRemote(remoteType.NAVIGATION));
dmc.moveTo(destination);
changeState(State.IMMEDIATE);
controlPnl.addRemote(Remote.createRemote(remoteType.IMMEDIATE));
}
在此代码中,addRemote方法使用新按钮更新controlPnl GUI。 dmc.moveTo方法中最多包含两个Thread.sleep调用,我认为在对controlPnl GUI进行更新之前会先调用它们。我已经注释了dmc.moveTo之后的两个方法调用,这些方法将GUI恢复为调用之前的状态,并且controlPnl直到moveTo完成执行后才完成更新。我需要的是GUI在moveTo方法开始执行并使线程进入睡眠状态之前完成更新。有什么方法可以在Java 6中完成?
如果需要解决的话,moveTo方法会将LEGO Mindstorm机器人移动到用户定义的路径上的指定点。正在更新的GUI提供了Swing组件(JButton和JRadioButton),供用户在导航时控制机器人。 addRemote方法更改了供用户使用的Swing组件集,而moveTo方法将命令发送给机器人以实际执行运动(通过告诉其电机运动,睡眠正确的时间,然后告知其电机进行运动)。停止移动)。我正在使用状态机模式,并且此方法是处理来自UI的事件的控制器的一部分。
最佳答案
您只有一个GUI线程。不要用它来打电话。如果这样做,则必须先完成这些步骤,然后GUI中才能进行其他任何操作。
至少您要启动一个新线程来执行您的dmc.moveTo(destination)
。这不是您执行此操作的唯一位置,并且可能希望设置Executor来执行这些任务。
在不了解更多代码的情况下(尤其是因为您使用的是静态方法),我无法评论您如何设置Executor
,但是使用Thread
的最简单示例是:
public static void moveTo(final Coordinate destination) {
changeState(State.NAVIGATION);
controlPnl.addRemote(Remote.createRemote(remoteType.NAVIGATION));
new Thread(new Runnable() {
public void run() {
dmc.moveTo(destination);
changeState(State.IMMEDIATE);
controlPnl.addRemote(Remote.createRemote(remoteType.IMMEDIATE));
}
}).start();
}
这将创建一个新的
Thread
来执行执行您的Runnable
的(匿名)moveTo()
。注意,这要比准备运行任务的Executor
效率低得多。它必须每次都创建一个新的Thread
。但是,如果这不是您需要的性能问题,那就很好了。还要注意,由于我直接在匿名内部类中引用destination
,因此在传递给您的方法时必须将其声明为final
。