【问题标题】:Simple way to wait for a method to finish before starting another one在开始另一个方法之前等待一个方法完成的简单方法
【发布时间】:2012-07-10 02:47:15
【问题描述】:

我对 Java 线程一点也不熟悉) 方法)。

基本上结构是

public static void draw() {
    // draws stuff


    compare();
}

问题是 drawGUI() 绘制的窗口在处理 (compare() ) 结束之前有一些主要的视觉伪影。

在 draw() 完成执行后,我可以实现启动 compare() 的最简单方法是什么?谢谢

【问题讨论】:

  • 理论上应该是这样。它执行 //draw 中的所有代码,然后执行 compare() 中的所有代码。除非 //draw stuff 中的代码创建了一个新线程。
  • 它创建了窗口,但它显示了一些视觉伪影,一个黑色的粗列,并且在 compare() 完成之前不会绘制组件(按钮和文本区域)。
  • @ghostbust555 这可能没有那么简单,因为没有完成绘制方法可能是导致视觉伪影的原因(即调用方法可能必须先做其他事情)。
  • 我同意。但它正在做它应该做的事情——在做 compare() 之前完成 draw()。这不是我认为的预期结果
  • 您使用的是什么 GUI 框架?摇摆?那是安卓应用吗?

标签: java multithreading user-interface


【解决方案1】:

最简单的方法是把你的draw() 代码放在最后一个asyncExec() 里面

new Thread(new Runnable() {
public void run() {

    //do long running blocking bg stuff here
    Display.getDefault().asyncExec(new Runnable() {
        public void run() {
            draw();
        }   
    }
}).start();

【讨论】:

  • 顺便说一句,更好的方法是使用观察者模式...en.wikipedia.org/wiki/Observer_pattern
  • 这是特定于 SWT 的(我认为)-不确定这是否是最初的问题...
  • 是的,你是对的,它是,但是有一个类似于摇摆的调用,SwingUtilities.invokeLater,但问题的核心是线程时间问题,我不想去谷歌寻找正确的摇摆电话:-)
  • 它无法识别类 Display
【解决方案2】:

假设您获得文物的原因是draw() 没有机会返回,您可以使用Thread

final T parent = this;
new Thread(new Runnable() {
    public void run() {
        parent.compare();
    }
}).start();

(其中 T 是具有您的 compare 方法的类的类型)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多