【发布时间】:2011-06-30 23:51:13
【问题描述】:
我正在阅读 Java 线程 第 3 版。奥克斯和黄(O'Reilly 2004)。
他们在整本书中都有一个 Swing 打字游戏的例子。
他们定义的类大多是javax.swing.JComponent的自定义子类。
对我来说似乎很不对劲的是,他们使用各种同步方法使JComponents 线程安全。我的印象是 Swing 组件不应该是线程安全的,而是应该始终从 Swing 事件调度线程访问它们。 (有趣的是,他们通过 Swing EDT 修改组件的少数几次之一是针对 setText,这是极少数不需要从 EDT 调用的 Swing 方法之一。)
我想从你们当中有很多编写/阅读 Swing 代码经验的人那里知道: 程序员让 Swing 组件同步而不是总是通过 EDT 修改它们是否常见?可以忍受吗?
编辑:
我注意到这与thread 几乎是同一个问题。然而,它并没有说明程序员在野外实际做了什么。 O'Reilly 的书会如此公然违反 Swing 线程模型,这让我感到困惑。
编辑:
我发现他们确实在书的中间某处简要解释了 Swing 线程模型。尽管如此,我想回答我的问题。我感觉大多数读过这本书的人最终都会违反 Swing 线程模型,因为他们的大多数示例都是这样做的。
编辑:
如果你想看代码,你可以Download examples code作为一个zip文件。参见例如 ch03/example1/AnimatedCharacterDisplayCanvas。
编辑:
我刚刚了解到setText 在 Java7(2011 年 7 月发布)中不是线程安全的。
【问题讨论】:
-
我总是确保在 EDT 上完成更新。
-
你错了:
setText必须从 EDT 调用! -
@jfpoilpret 根据API,它是线程安全的。所有
JTextDocuments 都包含一个内部AbstractDocument,它有一个写锁。无论您是否从 EDT 调用setText都没有区别,因为必须获得锁。 (但是getText不是线程安全的。) -
想一想:在 EDT 上调用
setText可能是个坏主意,因为它可能会在等待文档锁定时卡住。 -
setText在 Java 7 中并没有变得不安全,它从来就不是安全的,与文档相反。 Java 7 修复了文档以反映现实。
标签: java multithreading swing