【发布时间】:2014-03-21 13:32:41
【问题描述】:
据我所知,所有的摆动组件都应该只从 EDT 中创建、修改和查询。
因此,如果我碰巧按了JButton“提交”,假设这将打包文本框中的所有信息,将数据发送到控制器,然后控制器将其发送到其他控制器,最终将内容发送到服务器.该按钮的操作在哪个线程上运行?如果它在 EDT 上运行,我如何退出它以将数据从主线程发送到控制器?我什至应该使用主线程从控制器向服务器发送数据吗?
所以我要说的是这个
java.awt.EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
JButton button = new JButton("Submit");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// WHAT THREAD DO ACTIONS HERE RUN ON?
// AND HOW DO I MAKE THEM RUN ON MAIN THREAD?
// AND WHAT THREAD SHOULD I RUN THING ON HERE?
}
});
}
});
【问题讨论】:
-
actionPerformed()在 EDT 中运行。从那里开始的操作是否应该在 EDT 中运行,以及如何将它们分派到其他线程以防万一,在很大程度上取决于您的应用程序设计。 -
对于真实的生产代码,没有任何副作用,使用 Runnable#Thread 的实际错误(可重复使用,也具有无限循环),必须输出到 Swing GUI(在 Swing API 中实现的方法)包装到 invokeLater
标签: java multithreading swing events thread-safety