小编典典

GUI更新之前线程休眠(Java 6)

java

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的事件的控制器的一部分。


阅读 205

收藏
2020-11-26

共1个答案

小编典典

您只有一个GUI线程。不要用它来打电话。如果您这样做,则必须先完成这些操作,然后GUI中才能进行其他任何操作。

至少您要启动一个新线程来执行您的任务dmc.moveTo(destination)。更可能的是,这不是唯一的地方,你这样做,并且可能需要一个执行器设置为执行这些任务。

在不了解您的代码的情况下(尤其是因为您使用的是静态方法),我无法评论您如何设置,Executor但是使用a的最简单示例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传递给您的方法时进行声明。

2020-11-26