Swing - 典型桌面应用程序中的并发

时间:2011-01-27 16:08:02

标签: java swing concurrency

这可能是一个广泛的问题,但我想知道并发通常用于单用户桌面应用程序的位置。您如何发现可能出现并发问题的案例(在设计阶段,理想情况下)?

P.S:从操作系统理论来看,我认为当资源无法共享时,通常会发生并发问题(例如:打印机)。我对编程层面的情况仍然很模糊。

4 个答案:

答案 0 :(得分:5)

Event Dispatch thread和其他逻辑之间的Swing可能存在线程问题。 在EDT上运行长时间运行的代码通常是一个坏主意,因为这意味着用户界面在等待代码运行时看起来像是被锁定的。解决方案是在ProgressWorker中运行长时间运行的代码,以创建新线程。

这是我们可以解决问题的地方。如果worker和EventDispatch线程同时正在改变事物,则可能存在并发问题(想象一下在列表上循环而另一个线程修改它)。这通常不是问题,因为好的摆动代码只会修改事件调度线程中的Swing组件。

答案 1 :(得分:3)

想象一下,您正在编写一个协作文本编辑器。您将拥有一个GUI线程来接收来自用户的输入,以及一个网络线程接收其他用户所做的更新。这两个线程必须同时访问表示正在编辑的文本状态的对象,并且必须使用互斥锁或其他同步原语序列化对该对象的访问。

答案 2 :(得分:3)

一般来说,这是需要执行长时间运行的任务时,如果它在事件调度线程上执行,则会在完成时明显锁定它。因此,从互联网上获取页面,重处理,磁盘I / O等等都会更好,不是在事件派发线程中,而是作为单独的线程。

略微超出范围,但通常处理这些情况的最佳工具是SwingWorker,它允许任务在单独的线程中运行,并以线程安全的方式通知其进度和完成的摆动。

答案 3 :(得分:3)

为了使事情更清楚,一个明显的表现形式可能是here之类的闪烁问题。或者您可以想象一个在摆动中编程的图片显示器,其中要加载和显示大尺寸图片。如果没有在swingworker上正确穿线,这可能会减少用户体验,因为他在设置组件的同时等待图像加载。所以回答你的第二个qn-

  

你如何发现案件(在设计上   阶段,理想情况下)并发   问题可能会出现?

您可以识别出现资源密集型操作的地方(例如图像加载)并将它们放在swingworker线程上。

  • 不应该是耗时的任务 在Event Dispatch Thread上运行。 否则应用程序变为 反应迟钝。
  • 摇摆组件应该是 仅在Event Dispatch Thread上访问。

source