2013-03-08 14 views
22

Po latach programowania Java zawsze wykorzystywane do tworzenia moich main() metody tak:Dlaczego warto użyć SwingUtilities.invokeLater w głównej metodzie?

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

Ale niedawno uczyłem kilka kodów z sieci i zobaczyłem ten czasami zamiast zwykłego main() korzystanie powyżej:

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

ja po prostu chcę wiedzieć:

  • Dlaczego warto korzystać z tego zamiast zwykłej main() WA y? Nie widzę żadnej różnicy, kiedy spróbuję.
  • Jaka jest różnica między tymi dwoma sposobami?

Dziękuję za przeczytanie mi i odpowiedzi.

Odpowiedz

23

Dokumenty wyjaśniają dlaczego. Od Initial Threads

Dlaczego pierwszy wątek nie tworzy samego GUI? Ponieważ prawie cały kod, który tworzy lub współdziała z komponentami Swing, musi działać w wątku wysyłki zdarzeń.

oraz The Event Dispatch Thread

Niektóre metody elementów Swing są oznaczone jako "bezpieczną nici" w specyfikacji API; można je bezpiecznie wywoływać z dowolnego wątku. Wszystkie inne metody komponentu Swing muszą być wywoływane z wątku wysyłki zdarzeń. Programy, które ignorują tę regułę, mogą działać prawidłowo przez większość czasu, ale są podatne na nieprzewidziane błędy, które są trudne do odtworzenia.

+0

Widzę, bardzo interesujące. Dzięki za linki i podkreślenie tego, co istotne. – Rob

14

Ponieważ wątek "main" rozpoczęty przez VM nie jest wysyłka wątek wydarzenie.

3

Kilka komponentów Swing z API nie jest bezpiecznych dla wątków, co oznacza, że ​​mogą powodować pewne problemy, takie jak zakleszczenie, więc lepiej jest tworzyć i aktualizować takie komponenty zmiennoprzecinkowe za pomocą wątku rozsyłającego zdarzenia dostarczonego przez Swing, ale nie z głównego wątek lub dowolny inny wątek utworzony z głównej.