这可能是一个广泛的问题,但我想知道并发通常用于单用户桌面应用程序的位置。您如何发现可能出现并发问题的案例(在设计阶段,理想情况下)?
P.S:从操作系统理论来看,我认为当资源无法共享时,通常会发生并发问题(例如:打印机)。我对编程层面的情况仍然很模糊。答案 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线程上。