2010-07-03 120 views
5

我有一個工作線程應該等待EDT更新GUI才能繼續執行。我用發佈方法告訴美國東部時間改變一些東西。我如何讓工人等待這種變化發生?Java swing工作線程等待EDT

+2

你的意思是像一個'暫停'按鈕? – trashgod 2010-07-03 22:17:34

+2

聽起來像是想嘗試一件非常糟糕的事情。 – 2010-07-03 22:53:23

回答

4

如果它也正在啓動GUI改變你同樣的工作線程,那麼就等待,不能進行這些變化的準備建造的機制:

SwingUtilities.invokeAndWait()

應該很好地適應該法案。

另一種替代方法是使用SwingUtilities.invokeLater()爲EDT提供一些運行代碼,一旦EDT變爲空閒狀態,即它開始執行此任務時,它將喚醒您的線程。這包括立即觸發invokeLater(),緊接着是wait(),並希望在執行wait()之前從EDI中喚醒。不過,這在時間上並不十分安全。

5

我假設你正在使用SwingWorker發佈你的結果。您可以使用布爾標誌來指示該值已被處理。在發佈中間結果之前,該標誌被清除,然後用於阻塞線程直到它被設置。 UI線程在完成處理髮布的數據時設置該標誌。

class MyWorker extends SwingWorker<K,V> 
{ 
    boolean processed = true; 

    protected void doInBackground() { 
     for (;;) { 
      setProcessed(false); 
      publish(results); 
      waitProcessed(true); 
     } 
    } 

    synchronized void waitProcessed(boolean b) { 
     while (processed!=b) { 
      wait(); 
     } 
     // catch interrupted exception etc. 
    } 

    synchronized void setProcessed(boolean b) { 
     processed = b; 
     notifyAll(); 
    } 


    protected void process(List<V> results) { 
     doStuff(); 
     setProcessed(true); 
    } 
} 
+0

謝謝你的回答。我選擇了Carl Smotricz的方法,因爲它在我的情況下更有意義,我完全忘記了invokeAndWait。但是你所建議的方法仍然很有用。 – Mihaela 2010-07-04 09:50:29