【发布时间】:2015-03-04 10:16:51
【问题描述】:
Swing 需要从事件调度线程 (EDT) 中运行。如何在 Spring 上下文中确保这一点?
在一些教程中,like this one,swing 组件只是像普通 bean 一样被实例化。这样可以吗?
【问题讨论】:
标签: java spring swing event-dispatch-thread
Swing 需要从事件调度线程 (EDT) 中运行。如何在 Spring 上下文中确保这一点?
在一些教程中,like this one,swing 组件只是像普通 bean 一样被实例化。这样可以吗?
【问题讨论】:
标签: java spring swing event-dispatch-thread
正如您已经猜到的那样,在 Event Dispatching Thread 又名 EDT 中运行您的 Swing 代码会更安全,因为大多数Swing 组件不是线程安全的。以下是 Oracle 文档中的说明:
Swing 事件处理代码在称为事件的特殊线程上运行 调度线程。大多数调用 Swing 方法的代码也运行在 这个线程。这是必要的,因为大多数 Swing 对象方法都是 不是“线程安全的”:从多个线程中调用它们会带来线程风险 干扰或内存一致性错误。
因此,如果您在 EDT 线程中初始化 Spring ApplicationContext 以便您的组件被初始化并在同一个线程中运行,那么您应该是安全的:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ClassPathXmlApplicationContext( "your-application-context.xml" ); // pay attention to context so that it is not left open
}
});
【讨论】: