当前位置: 首页 > 面试题库 >

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

叶建柏
2023-03-14
问题内容
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更新之前已html" target="_blank">调用了它们。我已经注释了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)。更可能的是,这不是唯一的地方,你这样做,并且可能需要一个执行器设置为执行这些任务。

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



 类似资料:
  • 主要内容:1 什么是Java 线程休眠,2 Java sleep()方法语法,3 Java sleep()方法例子1 什么是Java 线程休眠 Thread类的sleep()方法 用于使线程休眠指定的时间。 2 Java sleep()方法语法 Thread类提供了两种使线程休眠的方法: public static void sleep(long miliseconds)throws InterruptedException public static void sleep(long milis

  • 问题内容: 我试着通过网络搜索,但是徒劳。有没有一种方法可以使用hibernate来执行幂等更新。 一种用例是使用HTTP PUT通过REST API更新数据库中的特定字段。因此,例如,如果我有一个包含列: _ Id,Name,Phone,UpdateDate*_ 的数据库 _ ,_ 并且我多次用相同的值更新(特定 ID的 ) Phone ( 电话) 字段,那么只有我的第一个操作必须更新 Phon

  • 问题内容: 我在hibernate和延迟加载方面遇到问题。 背景:我有一个Spring MVC Web应用程序,我将Hibernate用于持久层。我正在使用OpenSessionInViewFilter使我能够在视图层中延迟加载实体。我正在扩展HibernateDaoSupport类,并使用HibernateTemplate保存/加载对象。一切都进行得很好。直至现在。 问题:我有一个可以通过Web

  • 本文向大家介绍Java线程调度之线程休眠用法分析,包括了Java线程调度之线程休眠用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Java线程调度之线程休眠用法。分享给大家供大家参考。具体分析如下: Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。   这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而

  • 问题内容: 您好,我想知道从swingworkerthread向jtextarea添加文本的最佳方法是什么,我创建了另一个类,Threadsclass()。execute()调用了jbutton。并且线程与此代码并行运行 现在id要做的是将x的值添加到主gui上的文本区域,任何想法都值得赞赏。 问题答案: JavaDocs有一个很好的例子 看一下发布和处理 潜在的意图是,您仅需要从事件调度线程中更

  • 问题内容: 我用javafx做棋盘游戏,偶然发现一个问题。我的应用程序具有客户端/服务器连接。每当服务器发送有关玩家将棋子移动到何处的数据时,我都会调用一个函数pawnPawn()来移动棋子,并调用另一个函数refresh()来重新绘制棋盘和棋子。不幸的是,我收到错误消息,说该函数是从不是FX的线程调用的,因此无法继续执行。我尝试了任务和Platform.runLater,但要么做错了,要么不起作