使Swing组件同步

tot*_*to2 6 java swing multithreading

我正在阅读Java Threads 3rd Ed.由奥克斯和黄(O'Reilly 2004).他们在整本书中都有一个Swing打字游戏的例子.他们定义的类主要是自定义子类javax.swing.JComponent.

对我来说似乎完全错误的是,他们JComponent使用各种同步方法使这些线程安全.我的印象是Swing组件不应该是线程安全的,而是应该始终从Swing事件调度线程访问它们.(有趣的是,他们通过Swing EDT修改组件的次数之一,它是a setText,这是很少有不需要从EDT调用的Swing方法之一.)

我想知道一些有很多编写/阅读Swing代码经验的人:程序员是否常常使Swing组件同步而不是总是通过EDT修改它们?它可以忍受吗?

编辑:
我注意到它与这个帖子几乎是同一个问题.然而,它没有说明程序员在野外实际做了什么.我很困惑,O'Reilly的书会如此公然违反Swing线程模型.

编辑:
我发现他们在本书的中间部分简要解释了Swing线程模型.尽管如此,我想回答一下我的问题.我觉得大多数阅读本书的人最终会违反Swing线程模型,因为他们的大多数例子都是如此.

编辑:
如果要查看代码,可以将示例代码下载为zip文件.例如,参见ch03/example1/AnimatedCharacterDisplayCanvas.

编辑:
我刚刚了解到setText在Java7中不会是线程安全的(2011年7月发布).

tra*_*god 2

简而言之,只要同步方法不在 上执行EventQueue,它们就不会阻塞事件调度线程。相反,在另一个线程上执行的方法应始终使用来通过、或相关机制(例如或 )EventQueue分派代码。实际上,这些都是可靠的。这些例子可能是正确的,但应该从这个角度来审视它们。invokeLater()invokeAndWait()javax.swing.Timerjavax.swing.SwingWorker

APIEventQueue说:“唯一的要求是事件......按照它们排队的顺序进行调度。” 在我看来,这相当于java.util.concurrent 和 JLS 的“发生之前”关系。更详细的讨论可以在这里找到。