2014-01-03 3 views
1

Я прочитал ряд статей в Интернете о том, когда что-то должно запускаться в EDT, а когда этого не должно быть. Но я до сих пор не уверен, что понимаю, поэтому я хотел бы задать несколько вопросов по этому поводу:Об EDT (Java)

  1. Какие части кода собираются работать по умолчанию внутри EDT?

  2. Какие фрагменты кода будут запущены по умолчанию снаружи EDT?

  3. Когда я должен использовать InvokeLater(), то что-то, что по умолчанию будет за пределами EDT, будет работать внутри него?

  4. Когда я должен помешать выполнению части кода (по умолчанию) внутри EDT, создав новый поток и поместив в него этот код?

Благодаря

ответ

0

Прежде всего спасибо большое за редактирования и форматирования ваш вопрос очень хорошо. Это очень помогает при ответе на ваш вопрос.

Также я должен признать, что я не уверен на 100% о своих ответах, поэтому ребята: не стесняйтесь исправить меня, если я ошибаюсь.

  1. Все, что меняет ваш графический интерфейс.

  2. Не совсем уверен в этом.

  3. Если вам нужно обновить свой gui с помощью вычислений с интенсивным временем. Например, если вы хотите показать цифры от 0 до 100000000 в JLabel.

  4. Все, что будет блокировать ваш графический интерфейс от взаимодействия с пользователем, потому что это занимает много времени, например, некоторые расчеты с большим наборов данных .. Но вы должны убедиться, что доступ к значениям только одной нити или для синхронизации нитей с volatile и
    synchronize ...

+0

Ваши ответы на вопросы 1 и 2 действительно отвечают на вопрос «что ** должно ** работать внутри (или снаружи) EDT». Не вопрос OP, который «Что работает, по умолчанию, внутри или вне EDT». –

+0

yep я запутался в цифрах и отредактировал мой ответ ... я думаю, теперь это должно быть правильно, но я думаю, что ваши ответы гораздо точнее, поэтому я поддержал вас ;-) – dehlen

3
  1. Весь код, выполняемый прослушивателя событий.
  2. Код в вашем основном методе, код, выполняемый внутри потока, который вы явно запускали, или который был запущен с помощью таймера или SwingWorker.
  3. При создании графического интерфейса Swing в основном методе. Или когда вы хотите взаимодействовать с компонентом Swing (или его моделью) из фонового потока.
  4. Когда этот кусок кода блокируется (например, длинный IO) или выполняется более нескольких миллисекунд. Весь код, выполняемый внутри EDT, не позволяет этому потоку выполнять основное задание: перерисовка графического интерфейса и реагирование на события.
+0

Спасибо за ответ. О ответе 1: Вы имеете в виду ТОЛЬКО тип кода, который будет запущен, по умолчанию в EDT, это код в методах actionPerformed()? Ничего больше? – user3150201

+0

Не только actionPerformed(). Все методы обработки событий других типов слушателей (ItemListener, MouseListener, SelectionListener и т. Д.). И, конечно, это транзитивно: если actionPerformed() вызывает foo(), который вызывает bar(), который вызывает baz(), все эти методы выполняются в EDT. В типичном графическом приложении практически все выполняется как ответ на событие. –

+0

Хорошо. Является ли вызов repaint() в классе класса расширения JPanel в EDT? – user3150201

Смежные вопросы