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

Зачем использовать SwingUtilities.invokeLater в основном методе?

После лет программирования Java я всегда использовал для создания методов main():

public static void main(String[] args) 
{
    runProgram();
}

Но недавно я изучил некоторые коды из Интернета и видел это иногда вместо обычного main() использования выше:

public static void main(String[] args) 
{
    SwingUtilities.invokeLater(new Runnable() 
    {
        public void run() 
        {
            runProgram();
        }
    });
}

Я просто хочу знать:

  • Зачем использовать это вместо обычного main() способа? Я не вижу никакой разницы, когда я даю ему попробовать.
  • В чем разница между этими двумя способами?

Спасибо, что прочитал меня и ваши ответы.

4b9b3361

Ответ 1

Документы объясняют, почему. Из Начальные темы

Почему исходный поток просто не создает сам GUI? Поскольку почти весь код, который создает или взаимодействует с компонентами Swing, должен запускаться в потоке отправки событий.

и Отправка событий

Некоторые методы компонента Swing помечены как "потокобезопасные" в спецификации API; они могут быть безопасно вызваны из любого потока. Все остальные методы компонента Swing должны быть вызваны из потока отправки событий. Программы, которые игнорируют это правило, могут нормально функционировать большую часть времени, но подвержены непредсказуемым ошибкам, которые трудно воспроизвести.

Ответ 2

Поскольку поток "main", запущенный VM, не является потоком отправки событий.

Ответ 3

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