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ę?

questionAnswers(2)

yourAnswerToTheQuestion