2014-10-08 342 views
0

我對Java中的多線程有點困惑,我有一個GUI,我創建了一個線程,另一個項目充當服務器並用於從其他數據源接收數據是在一個單獨的線程。服務器的線程在GUI線程的一個視圖中調用方法並更新狀態,但GUI不更新。我怎樣才能正確設置這個架構。下面是我有:從另一個線程更新GUI線程

public static void main(String[] args) 
{ 
    //Connections 
    Runnable r2 = new Runnable() { 
     @Override 
     public void run() 
     { 
      App.connectToServer(); 
     } 
    }; 

    //Launch main window 
    Runnable r1 = new Runnable() { 
     @Override 
     public void run() 
     { 
      //Installs theme 
      WebLookAndFeel.install(); 

      //Launches main window 
      BootWindow myMainWindow = new BootWindow(); 
     } 
    }; 

    Thread thr1 = new Thread(r1); 
    Thread thr2 = new Thread(r2); 
    thr1.start(); 
    thr2.start(); 
} 

//Server connections 
private static void connectToServer() 
{ 
    System.out.println("Connecting to the eTrade Manager Server.."); 
    etmServer server = new etmServer(); 
    server.connectEtmServer(); 

} 
+1

閱讀Swing中的Oracle trail Concurency, EventDispatchThread – mKorbel 2014-10-08 15:07:24

+0

[請閱讀偶數調度線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html),因爲您需要更新其上的任何GUI組件。 – 2014-10-08 15:07:37

+0

回答[這裏](http://stackoverflow.com/a/26267512/230513)。 – trashgod 2014-10-08 22:35:11

回答

0

如果您正在使用AWT/Swing的,在GUI運行在一個特殊的線程調用事件分派線程(EDT)和所有的GUI更新必須在線程中運行。所以您需要這樣做:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     //code goes here 
    } 
    }); 

請記住,Swing是單線程的並且不是線程安全的。

+0

ok現在如何在服務器的線程更新組件後,刷新GUI? @dramzy – kknaguib 2014-10-08 15:13:34

+0

Swing組件有一個repaint()和revalidate()方法。您可以調用重新驗證,然後重新刷新以刷新該組件。 – dramzy 2014-10-08 15:18:27

+0

好吧我這樣做了,我得到一個異常java.util.ConcurrentModificationException不知道如何處理併發我對多線程應用程序開發有點新,感謝您的幫助@dramzy – kknaguib 2014-10-08 15:28:31