繁体   English   中英

同步方式下未执行的方法

[英]Method Not Executing in a Synchronous Manner

我有一个正在构建的基于MVC的Java应用程序,并且控制器内有一个特定的方法(如下所示),其行为如下:

  • 正如我所希望的那样,该模型是通过initialize方法更新的。
  • 由于model.start()方法永远不会终止(因为它是一个无限的while循环),因此不会更新视图。

我想先更新视图,然后再start()模型。 如何更改代码以获得所需的行为?

我想一种解决方法是用触发我的模型能够观察到的事件的代码替换model.start()行,但是我还没有尝试过,因为我想了解问题的根源。

另外,我不知道这是否相关,但是我的主应用程序类通过SwingUtilities.invokeLater(new Runnable()...为我的swing组件定义了一个单独的线程,并且我的视图由swing组件组成。一些与多个线程执行相关的问题,如果是这样,那将解释为什么我的initializedPerformed()方法未以同步方式执行。

控制器中的行为不像我期望/想要的那样:

public void initializePerformed(Event e) {
    model.initialize(e);
    view.getPanel().setName(model.getName());
    model.start();
}

model.start():

public void start() {
    while (true) {

    }
}

如果您完全需要model.start() ,我非常怀疑您这样做,那么可以在这样的单独线程中启动它:

new Thread() {
    public void run() {
        model.start();
    }
}

如果model实际上是从Thread继承的,那么您根本不应覆盖start() 您应该重写run() ,该方法在Thread.start()之后以及实际创建新线程之后调用。 如果覆盖start() ,则不会创建新线程。

据我所知,swing的所有操作都必须由“主”应用程序线程完成(我忘记了它的技术名称)。

模式是:创建线程来处理您的数据,并保留主线程仅用于显示。 当有应该显示的事件时,通知视图,但让主线程对其进行更改(通常使用信号量模式,但是如果发现它过于复杂,则还可以有一个无限循环,该循环看起来每隔100毫秒会有一个新变化示例并调用wait()再次检查:业务线程将更改主线程可访问的变量。

最好的问候,Zied Hamdi http://1vu.fr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM