Что касается потоков в Swing GUI

1

Я хочу убедиться, что что-то понимаю. Пожалуйста, подтвердите это верно или нет.

Один я объявляю поток и запускаю что-то внутри него - все, начиная с этого момента, будет запускаться внутри этого потока, если я явно не создаю новый поток. Независимо от того, сколько классов и методов проходит код - он останется в одном потоке.

Например, скажем, у меня есть приложение, которое полностью работает внутри одного настраиваемого 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.
    } );
}
Теги:
multithreading
swing
event-dispatch-thread

1 ответ

6
Лучший ответ

Один я объявляю поток и запускаю что-то внутри него - все, начиная с этого момента, будет запускаться внутри этого потока, если я явно не создаю новый поток. Независимо от того, сколько классов и методов проходит код - он останется в одном потоке.

Верный. Фактически, даже если вы создаете новый поток, текущий поток выполнения потока никогда не будет изменен. Этот новый поток начнет выполняться некоторое время в будущем после его запуска, но его поток не зависит от потока, который его создал.

который - и, пожалуйста, исправьте меня, если я ошибаюсь - это именно то, что мне нужно большую часть времени с Swing

Вы не правы. Вы не хотите делать все в EDT. Любые извлечения данных и манипуляции в EDT снижают вашу репутацию GUI. Скажем, например, вы хотите получить много данных из БД. Если вы сделаете это в EDT, ваш графический интерфейс замерзнет, и пользователь не сможет взаимодействовать с ним, пока вы его не закончите (и, вероятно, манипулируете им).

  • 0
    Смотрите также Параллельность в Swing .
  • 1
    Понимаю. Кроме задач, которые требуют много времени, чтобы конкурировать - есть ли еще виды задач, на которые я должен обратить внимание, чтобы не выполнять внутри EDT?
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню