Что делает 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().