【发布时间】:2016-09-03 10:44:04
【问题描述】:
在关于线程的 Java 课程的最后几分钟,我们的教授建议我们在开发复杂的基于 Swing 的应用程序时要特别注意,因为 Swing 不是线程安全的。这背后有什么具体原因吗? Swing 由于设计决策或软件限制而不是线程安全的?
提前感谢您的回答。
【问题讨论】:
标签: java multithreading swing thread-safety theory
在关于线程的 Java 课程的最后几分钟,我们的教授建议我们在开发复杂的基于 Swing 的应用程序时要特别注意,因为 Swing 不是线程安全的。这背后有什么具体原因吗? Swing 由于设计决策或软件限制而不是线程安全的?
提前感谢您的回答。
【问题讨论】:
标签: java multithreading swing thread-safety theory
Javin Poul 的编程博客 Java Revisited 有 a great blog post 关于这个:
为什么 Swing 在 Java 中不是线程安全的?
这是当时设计师做出的决定。由于使 API 线程安全需要大量工作,而且它通常基于您获得的好处。由于 GUI 屏幕大多是响应用户操作而更新的,例如当用户单击一个按钮时,由于事件在同一个事件调度程序线程中处理,因此很容易在该线程上更新 GUI。当 GUI 的更新请求来自不同的线程时,这是非常罕见的,例如可能是网络请求完成或文件加载后。
【讨论】:
大多数(如果不是全部)GUI 工具包不是线程安全的(Qt、Swing、Winforms...)。创建线程安全的 GUI 工具包会增加太多不必要的复杂性。在大多数情况下,创建就足够了 一个快速的事件处理程序。
例如,我们有一个计算按钮 从今天起 40 天后的一个工作日,将摄氏温度转换为华氏温度,或计算所提供值的总和。所有这些操作都可以相当快地计算出来。如果 Swing 是线程安全的,那么这些计算将放在单独的线程中,这显然是一种矫枉过正。因此,我们只将长时间运行的任务放入线程中,而不是这样,例如刻录 DVD、计算非常复杂的任务、下载大文件等。
【讨论】: