【问题标题】:Best approach for threading in GUI application (Java, swing) [closed]GUI应用程序(Java,swing)中线程的最佳方法[关闭]
【发布时间】:2015-06-17 23:43:53
【问题描述】:

为了保持 GUI 响应,有必要在与事件调度线程不同的线程上执行长时间运行的任务,例如数据库访问。 为此,有两种主要选择:创建 SwingWorker 并调用程序逻辑对象的方法(使它们交易安全!),或创建单个 Thread 类并将请求转发给它(如此处建议:Java desktop - how to separate database access from the UI thread?)。 您认为哪种方法以及在哪些情况下更好,尤其是从设计的角度来看?

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    这个问题很宽泛,缺乏任何重要的背景。

    SwingWorker“通常”是我的首选解决方案,因为它很简单,可以通过多种方式与之交互(publish/processdonePropertyListener),并且可以专门用于工作,无论是重复的工作单元还是单个运行案例。

    SwingWorker 有局限性,首先,它只允许 10 个同时运行的工作人员同时运行,它使用一个 Threads 池(为简单起见),它可以重复使用,但是游泳池限制为 10 个,您对此无能为力。如果您预计需要进行大量并发处理,这可能是一个问题,但如果您只是“希望完成工作”并且不在乎某些工作是否排队等待,则可能不是一个大问题一段时间。

    再次使用单个Thread 和队列可以工作,假设您不介意一次只完成一项工作,而另一个任务可能会排队一段时间。这种方法的复杂性在于设置回调过程,该过程可以使用Observer PatternProducer/Consumer Pattern 之类的方式将来自工作人员Thread 的数据/结果返回到EDT 上下文中的UI这对你来说足够灵活,SwingWorker 已经做到了。

    我的第一个想法是,专注于创建一个可以检索数据的流程,而不用担心并发性或 UI。一旦确定了这一点,您就可以在其上方添加另一个并发层,因为并非代码的每个方面都可能关心获取 UI 数据。

    您可以从那里设计访问机制,您的 UI 代码将使用这些访问机制根据您的需要访问这两个其他层。

    这都是理论,整个问题的上下文将决定您可能遵循(或组合)哪些路径(数据库是否支持并发访问?您想要多个/并发访问还是不关心?等) .您可以尝试以允许您更改单个层而无需(显着)修改其他层的方式解耦您的代码。

    【讨论】:

      【解决方案2】:

      你也可以使用 SwingUtilities.invokeLater()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-11
        • 2011-09-11
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        相关资源
        最近更新 更多