Я хочу убедиться, что что-то понимаю. Пожалуйста, подтвердите это верно или нет.
Один я объявляю поток и запускаю что-то внутри него - все, начиная с этого момента, будет запускаться внутри этого потока, если я явно не создаю новый поток. Независимо от того, сколько классов и методов проходит код - он останется в одном потоке.
Например, скажем, у меня есть приложение, которое полностью работает внутри одного настраиваемого JFrame. Если я хочу, чтобы все приложение запускалось внутри одного потока, я могу сделать это, создав новый поток и создав экземпляр нового JFrame внутри метода run() этого потока.
Будет ли это фактически гарантировать, что все приложение будет запущено внутри этого потока, где был создан JFrame, если я явно не создаю новый поток и не запускаю что-то внутри этого нового потока?
Это общий вопрос, но позвольте мне поговорить о Swing специально на секунду:
Если я хочу, чтобы все приложение Swing запускалось внутри EDT (которое, и, пожалуйста, исправьте меня, если я ошибаюсь, - это именно то, что мне нужно больше всего с Swing), достаточно использовать SwingUtilities.invokeLater()
один раз в main
метод, например:
public static void main(String[]args){
SwingUtilities.invokeLater( new Runnable(){
JFrame frame = new CustomJFrame(); // where the entire application runs.
} );
}
Один я объявляю поток и запускаю что-то внутри него - все, начиная с этого момента, будет запускаться внутри этого потока, если я явно не создаю новый поток. Независимо от того, сколько классов и методов проходит код - он останется в одном потоке.
Верный. Фактически, даже если вы создаете новый поток, текущий поток выполнения потока никогда не будет изменен. Этот новый поток начнет выполняться некоторое время в будущем после его запуска, но его поток не зависит от потока, который его создал.
который - и, пожалуйста, исправьте меня, если я ошибаюсь - это именно то, что мне нужно большую часть времени с Swing
Вы не правы. Вы не хотите делать все в EDT. Любые извлечения данных и манипуляции в EDT снижают вашу репутацию GUI. Скажем, например, вы хотите получить много данных из БД. Если вы сделаете это в EDT, ваш графический интерфейс замерзнет, и пользователь не сможет взаимодействовать с ним, пока вы его не закончите (и, вероятно, манипулируете им).