Czy aplikacja Swing GUI powinna być kontrolowana z Event Dispatcher lub głównego wątku?
Przeczytałem kilka książek o Javie. We wszystkich było co najmniej jeden rozdział dotyczący programowania GUI. We wszystkich z nich tworzenie prostej aplikacji formularza było zgodne z tą logiką:
MyFrame.java
public class MyFrame extends JFrame
{
JButton button1;
public MyFrame()
{
button1 = new JButton("Click here.");
}
}
FrameTest.java:
public class FrameTest
{
public static void main(String[] args)
{
MyFrame myFrame = new MyFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(600, 600);
myFrame.setVisible(true);
}
}
Zasadniczo, wystarczy podklasa JFrame, aby utworzyć formularz i zadeklarować jako zmienne instancji inne komponenty i zainicjować te komponenty w konstruktorze. Następnie utwórz kolejną klasę testową, utwórz instancję podklasy ramek w tej klasie i wywołaj niektóre z jej metod, aby była widoczna.
Ale w lekcjach współbieżności dowiedziałem się, że mamy główny wątek, który uruchamia main () w każdej tworzonej aplikacji. O ile wiem, kiedy używamy Swinga do tworzenia aplikacji GUI, mamy inny wątek (Event Dispatcher Thread). Więc jeśli się nie mylę, w każdej aplikacji GUI opartej na Swingie są co najmniej dwa wątki. To sprawia, że każda aplikacja GUI jest wielowątkowa. W niektórych artykułach i samouczkach, które przeczytałem, mówi, że Swing nie obsługuje wielowątkowości, dlatego wszystkie komponenty GUI powinny być tworzone i modyfikowane tylko w wątku Dyspozytora zdarzeń, w przeciwnym razie mogą wystąpić zakłócenia wątku i błędy niespójności pamięci.
Nawet w najprostszym przykładzie w Wikipedii (http://en.wikipedia.org/wiki/Swing_%28Java%29), jest to zrobione w ten sposób za pomocą metody invokeLater.
Więc który z nich jest prawdziwym podejściem? Gdzie się mylę?