Что делает EventQueue.invokeLater и что против потока start()?

Привет, я новичок в Opp и Java.

Я видел что-то о потоке, реализует Runnable, start() для вызова вызова run().

Но что это делает?

EventQueue

invokeLater();

Или эта полная строка, которую вы можете найти в этом посте по основному методу: JTextFields поверх активного рисования на JPanel, проблемы с многопоточностью

и ответ на этот же на основной метод: перелистывание страниц Java не поддерживается в Mac OS?

EventQueue.invokeLater(new NewTest());

Это вызов метода run ()? какая разница между этим и

Thread var = new Thread(this);
var.start();

2 ответа

Решение

Swing API является однопоточным: вы можете вызывать методы только для компонентов Swing из потока Swing.

В вашем приложении может быть несколько потоков, но в тот момент, когда другой поток должен взаимодействовать с компонентами Swing, он должен сделать это, используя EventQueue.invokeLater, Это гарантирует, что Runnable выполняется в правильном потоке.

Начиная свой собственный Thread не имеет этого эффекта (запуска в потоке Swing), поэтому он не является альтернативой. Если вы это сделаете, это может привести к повреждению данных, неправильным обновлениям экрана и т. Д. Это может быть временным, но также и непоправимым.

Но invokeLater Метод не является альтернативой для запуска собственного потока или использования пула потоков, так как все Runnables переданные ему выполняются последовательно, а не параллельно.

Я вижу что-то о потоке, реализует Runnable

Забудь, что ты когда-либо видел это. Это была плохая идея, которую следует осудить. Если вы хотите создать явный поток в Java-программе, сделайте это следующим образом:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        ...code to be run in the thread goes here...
    }
});

Я не собираюсь объяснять, почему в этом пространстве, но просто поверь мне. Теперь это хорошая привычка.

что это делает? ...invokeLater...

Пакет Swing создает поток, который реагирует на "события" (щелчки мыши, нажатия клавиш и т. Д.), И большая часть кода, который вы пишете для Swing, запускается как "обработчики", которые вызываются этим потоком.

Иногда ваш обработчик хочет сделать что-то, что не разрешено / не имеет смысла в контексте, в котором это вызывается. Я не программист на свингах, поэтому у меня нет удобного примера, но решение - вызвать invokeLater()

EventQueue invokeLater(new Runnable() {
    @Override
    public void run() {
        ...code that you want to run "later"...
    }
});

Это отправит новое событие в очередь событий, и когда поток событий выберет его из очереди, он выполнит предоставленный вами метод run().

Другие вопросы по тегам