2012-07-10 45 views
3

我不熟悉Java線程:(。我有這個類,當它調用時,構造一個新的窗口(繪製()方法)。 drawGUI()結尾調用的處理方法(比較()方法)。簡單的方法來等待方法完成之前開始另一個

基本結構是

public static void draw() { 
    // draws stuff 


    compare(); 
} 

的問題是,由drawGUI()繪製的窗口有一些重大的視覺僞影,直到處理(比較())結束。

什麼是我可以實現的最簡單的方法在draw()完成執行後啓動compare()?謝謝

+0

理論上這就是應該發生的事情。它執行//中的所有代碼,然後執行compare()中的所有代碼。除非//繪製東西的代碼創建一個新的線程。 – ghostbust555 2012-07-10 15:18:43

+0

它創建窗口,但它顯示了一些視覺工件,一個黑色的粗大列,並且不會繪製組件(按鈕和textarea),直到compare()完成。 – user573382 2012-07-10 15:22:59

+0

@ ghostbust555這可能並不是那麼簡單,因爲沒有完成繪製方法可能是導致視覺僞影的原因(即調用方法可能必須先做其他事情)。 – Thor84no 2012-07-10 15:23:07

回答

3

簡單的方法是隻把你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(); 
+0

順便說一句,更好的方法是使用觀察者模式... http://en.wikipedia.org/wiki/Observer_pattern – 2012-07-10 15:29:38

+0

這是SWT的具體(我想想) - 不知道這是什麼原始問題是關於... – assylias 2012-07-10 16:07:10

+0

是的,你是對的,它是,但有一個類似的調用,SwingUtilities.invokeLater,但問題的核心是線程計時問題,我不想去谷歌正確的鞦韆電話:-) – 2012-07-10 16:18:35

0

假設你得到的文物的原因是, draw()還沒有機會退貨,您可以使用Thread

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

(其中T是具有您的比較方法的類的類型)。

相關問題