2013-03-08 29 views
22

經過多年的Java編程,我總是用來創建我的main()方法是這樣的:爲什麼在主要方法中使用SwingUtilities.invokeLater?

public static void main(String[] args) 
{ 
    runProgram(); 
} 

但最近我研究了從網上的一些代碼,看到上面這有時而不是通常的main()使用:

public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      runProgram(); 
     } 
    }); 
} 

我只是想知道:

  • 爲什麼使用這個而不是通常的main() WA y?當我試一試時,我看不出有什麼不同。
  • 這兩種方式有什麼區別?

感謝您閱讀我的答案。

回答

23

該文檔解釋了原因。從Initial Threads

爲什麼初始線程不是簡單地創建GUI本身?因爲創建或與Swing組件交互的幾乎所有代碼都必須在事件派發線程上運行。

和從The Event Dispatch Thread

一些Swing組件方法在API規範標記爲 「線程安全」;這些可以從任何線程安全地調用。 必須從事件分派線程調用​​所有其他Swing組件方法。忽略此規則的程序可能在大多數情況下都能正常運行,但會遇到難以重現的不可預知的錯誤。

+0

我明白了,非常有趣。感謝您的鏈接並強調了必備。 – Rob 2013-03-08 20:08:00

14

因爲線程「主要」由VM開始不是事件調度線程

3

API中的一些Swing組件不是線程安全的,這意味着它們可能會導致一些問題,如死鎖,所以它最好使用Swing提供的Event Dispatcher線程創建和更新此類swing組件,但不能從main線程或從main創建的任何其他線程。

相關問題