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和JRadioButtons),供用户在导航时控制机器人。addRemote方法更改了供用户使用的Swing组件集,而moveTo方法将命令发送给机器人以实际执行运动(通过告诉其电机运动,睡眠正确的时间,然后告知其电机进行运动)。停止移动)。我正在使用状态机模式,并且此方法是处理来自UI的事件的控制器的一部分。
您只有一个GUI线程。不要用它来打电话。如果您这样做,则必须先完成这些操作,然后GUI中才能进行其他任何操作。
至少您要启动一个新线程来执行您的任务dmc.moveTo(destination)。更可能的是,这不是唯一的地方,你这样做,并且可能需要一个执行器设置为执行这些任务。
dmc.moveTo(destination)
在不了解您的代码的情况下(尤其是因为您使用的是静态方法),我无法评论您如何设置,Executor但是使用a的最简单示例Thread是:
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传递给您的方法时进行声明。
Runnable
moveTo()
destination
final