Swing требует запуска из потока отправки событий (EDT). Как обеспечить это в контексте Spring?
В некоторых учебниках, подобных этому, компоненты просто создаются как обычные bean-компоненты. Это нормально?
Swing требует запуска из потока отправки событий (EDT). Как обеспечить это в контексте Spring?
В некоторых учебниках, подобных этому, компоненты просто создаются как обычные bean-компоненты. Это нормально?
Как вы уже догадались, было бы безопаснее запускать код Swing в потоке Event Dispatching Thread, также известном как EDT, поскольку большинство компонентов Swing не потокобезопасный. Вот что указано в документах Oracle:
Код обработки событий Swing выполняется в специальном потоке, известном как поток диспетчеризации событий. Большая часть кода, вызывающего методы Swing, также выполняется в этом потоке. Это необходимо, потому что большинство методов объекта Swing не являются "потокобезопасными": вызов их из нескольких потоков может привести к взаимодействию потоков или ошибкам согласованности памяти.
Таким образом, вы должны быть в безопасности, если вы инициализируете свой Spring ApplicationContext
в потоке EDT, чтобы ваши компоненты инициализировались и запускались в одном потоке:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ClassPathXmlApplicationContext( "your-application-context.xml" ); // pay attention to context so that it is not left open
}
});