方法不以同步方式执行

时间:2013-07-19 21:59:33

标签: java model-view-controller

我正在构建一个基于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) {

    }
}

2 个答案:

答案 0 :(得分:1)

如果你需要model.start(),我非常怀疑你这么做,那么就在这样一个单独的线程中启动它:

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

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

答案 1 :(得分:0)

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

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

最诚挚的问候, 齐德哈姆迪 http://1vu.fr