【问题标题】:Java swing UI Threads and event button eventsJava swing UI 线程和事件按钮事件
【发布时间】: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


【解决方案1】:

从 Swing 触发的任何操作都将在 EDT 上运行。因此,actionPerformed 方法中的代码将已经在 EDT 上执行,无需您进行任何特殊处理。

要启动长时间运行的任务,例如向服务器发送数据,请使用 SwingWorkerCallableExecutorService

在实现 Swing UI 时,我更喜欢使用 SwingWorker,因为它是一个有用的 API,用于发布更新并在任务完成时自动在 EDT 上进行回调。

【讨论】:

  • 哇,非常感谢。据我了解,控制器应该使用 EDT 访问模型和视图,而视图只能使用 SwingWorker 访问控制器吗?
  • @Quillion 不,我想说模型、视图和控制器的所有访问都应该发生在 EDT 上。 SwingWorker.doInBackground() 应该完成繁重(耗时)的工作,在访问文件系统、与服务器通信等时,您通常会从 Action(即命令模式)启动工作程序。
  • 非常感谢。这是我正在寻找的图片,以便我能够理解该做什么以及如何去做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多