【问题标题】:Multithreading on GUI applicationsGUI 应用程序上的多线程
【发布时间】:2012-03-31 23:43:50
【问题描述】:

我正在开发一个 Java 应用程序,并且正处于编写 GUI 代码的阶段。出于某种原因,我在应用程序上遇到崩溃报告(不仅仅是 netbeans 控制台上的错误)。我想知道我处理事件的方式是否存在问题,因为报告经常说 AWT 调度线程崩溃。

我是否应该创建一个新线程来处理不同的事件 从 GUI 触发?

例如通过使用:

Executors.newCachedThreadPool().execute(new Runnable() {
                    public void run() {}});

这样的东西有可能修复崩溃吗?它会对应用程序性能产生负面影响吗?

【问题讨论】:

    标签: java multithreading user-interface


    【解决方案1】:

    您可能正在从多个线程访问 Swing。 AWT 和 Swing 都不是线程安全的。考虑使用SwingWorker class 以确保它不会在事件调度线程之外被访问。

    更多信息,这里是another answer,我已经给出了关于SwingWorker的信息。

    【讨论】:

    • 我相信我正在使用 SwingUtilities.invokeLater(new Runnable() { public void run() {} 。我会确保我不会错过某个地方。这就是你的意思吗?还有,有问题的 Executors 怎么样。我也应该使用它吗?
    • @latusaki, Executors 显然实现了线程池,从中操作 GUI 是不安全的。我推荐SwingWorker,因为它为您的并发算法和GUI 操作代码提供了一种交互方式。
    • 好的,谢谢。只是为了把事情说清楚。操作/更改 GUI 的操作应使用 SwingWorker 完成。如果一个操作由 GUI 事件启动,但不会改变 GUI 上的某些内容,我可以使用 Executor。另外:直接更改模型被认为与 Swing 交互?例如更改 JTextArea 的文档。
    • @latusaki,是的,你是对的。事件处理程序可以根据需要启动任意数量的线程。您只是无法更新其中的 GUI。更改模型可能会触发触发 GUI 更新的事件,因此您可能无法从另一个线程执行此操作。
    【解决方案2】:

    确保所有从不同于 GUI 线程的线程更新 GUI 的方法调用都使用SwingUtilities.invokeLater 转发到 GUI 线程。其他线程不应该直接更改 GUI。

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多