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

10-08 15:59