Должно ли приложение Swing GUI управляться из Event Dispatcher или из основного потока?
Я прочитал несколько книг о Java. Во всех них была хотя бы одна глава, посвященная программированию в GUI. Во всех них создание приложения простой формы следовало этой логике:
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);
}
}
По сути, просто создайте подкласс JFrame, чтобы создать форму и объявить в качестве переменных экземпляра другие компоненты и инициализировать эти компоненты в конструкторе. А затем создайте другой тестовый класс, создайте экземпляр подкласса frame в этом классе и вызовите некоторые из его методов, чтобы сделать его видимым.
Но на уроках параллелизма я узнал, что у нас есть основной поток, который запускает main () в каждом приложении, которое мы создаем. Насколько я знаю, когда мы используем Swing для создания приложений с графическим интерфейсом, у нас появляется другой поток (Event Dispatcher Thread). Так что, если я не ошибаюсь, в каждом приложении на основе Swing есть как минимум два потока. Это делает каждое приложение с графическим интерфейсом многопоточным. И в некоторых статьях и руководствах, которые я читал, говорится, что Swing не поддерживает многопоточность, поэтому все компоненты GUI должны создаваться и изменяться только в потоке диспетчера событий, в противном случае могут возникнуть ошибки интерференции потоков и ошибки несоответствия памяти.
Даже в простейшем примере в Википедии (http://en.wikipedia.org/wiki/Swing_%28Java%29), это сделано так через метод invokeLater.
Так какой из них является верным подходом? Где я не прав?