【问题标题】:Best approach for threading in GUI application (Java, swing) [closed]GUI应用程序(Java,swing)中线程的最佳方法[关闭]
【发布时间】:2015-06-17 23:43:53
【问题描述】:
【问题讨论】:
标签:
java
multithreading
swing
【解决方案1】:
这个问题很宽泛,缺乏任何重要的背景。
SwingWorker“通常”是我的首选解决方案,因为它很简单,可以通过多种方式与之交互(publish/process、done、PropertyListener),并且可以专门用于工作,无论是重复的工作单元还是单个运行案例。
SwingWorker 有局限性,首先,它只允许 10 个同时运行的工作人员同时运行,它使用一个 Threads 池(为简单起见),它可以重复使用,但是游泳池限制为 10 个,您对此无能为力。如果您预计需要进行大量并发处理,这可能是一个问题,但如果您只是“希望完成工作”并且不在乎某些工作是否排队等待,则可能不是一个大问题一段时间。
再次使用单个Thread 和队列可以工作,假设您不介意一次只完成一项工作,而另一个任务可能会排队一段时间。这种方法的复杂性在于设置回调过程,该过程可以使用Observer Pattern 或Producer/Consumer Pattern 之类的方式将来自工作人员Thread 的数据/结果返回到EDT 上下文中的UI这对你来说足够灵活,SwingWorker 已经做到了。
我的第一个想法是,专注于创建一个可以检索数据的流程,而不用担心并发性或 UI。一旦确定了这一点,您就可以在其上方添加另一个并发层,因为并非代码的每个方面都可能关心获取 UI 数据。
您可以从那里设计访问机制,您的 UI 代码将使用这些访问机制根据您的需要访问这两个其他层。
这都是理论,整个问题的上下文将决定您可能遵循(或组合)哪些路径(数据库是否支持并发访问?您想要多个/并发访问还是不关心?等) .您可以尝试以允许您更改单个层而无需(显着)修改其他层的方式解耦您的代码。
【解决方案2】:
你也可以使用 SwingUtilities.invokeLater()