Подтвердить что ты не робот

Что делает SwingUtilities.invokeLater?

Что делает SwingUtilities.invokeLater? Это просто задержка выполнения блока кодов внутри его метода run? В чем разница между вызовом действия в функции invokeLater или просто вызовом его в конце потока, который мы хотим выполнить? Может ли кто-нибудь помочь мне с тем, что действительно делает функция invokeLater?

4b9b3361

Ответ 1

Как говорили другие ответы, он выполняет ваш Runnable в потоке диспетчеризации событий AWT. Но зачем вам это делать? Поскольку структуры данных Swing не являются потокобезопасными, поэтому предоставить программистам легко достижимый способ предотвращения одновременного доступа к ним, дизайнеры Swing установили правило, что весь код, который обращается к ним, должен работать в одном потоке. Это происходит автоматически для кода обработки событий и отображения кода обслуживания, но если вы инициировали длительное действие - в новом потоке, конечно, - как вы можете сигнализировать о его прогрессе или завершении? Вам нужно изменить элемент управления Swing, и вы должны сделать это из потока, отправляемого событиями. Следовательно, invokeLater.

Ответ 2

Он запустит кусок кода в AWT-потоке. Это позволяет вам изменять графический интерфейс из других потоков.

От Docs:

Причиняет выполнение doRun.run() асинхронно на событии AWT диспетчерская резьба. Это произойдет в конце концов ожидаемые события AWT были обработанный. Этот метод следует использовать когда поток приложения должен обновите графический интерфейс.

Ответ 3

который будет Comment, но выглядит как дольше,... просто базовый материал

1/создать собственный EDT для правильного обновления GUI, т.е. если вы выполняете некоторый код, используя обычный ваниль Thread, java. util.Timer, Executor.. больше здесь

2/помогает с установкой Focus в JComponents iof есть некоторые Listeners, потому что если есть fe DocumentListener, вам трудно установить Focus на желаемый JComponents

3/блок выполнения кода задержки и переместите его к концам EDT

Ответ 4

Как уже отмечалось, InvokeLater позволяет безопасно вызывать методы в классах swing, когда вы не запускаете EventQueue для начала. Однако вы можете упростить свой код и свою жизнь, обратившись к другим полям и классам только из EventQueue. Они могут работать с качелями и друг с другом без всяких проблем многопоточности. Если вы запустили другой поток, используйте InvokeLater, чтобы как можно быстрее вернуться к EventQueue и свести к минимуму количество полей, которые должны быть синхронизированы или иным образом защищены.

Если вам нужно использовать максимум из нескольких ядер, вам придется сократить использование EventQueue, и вам придется заплатить большую цену по сложности.

Ответ 5

Обратите внимание, что вы в конечном итоге получаете вызов метода doRun.run() для каждого вызова callokeLater (doRun). Поэтому, если вы вызываете его десять раз, прежде чем поток событий получит возможность выполнить его обработку, вы, скорее всего, получите десять последовательных вызовов doRun.run().