我有一个在多个线程上运行的Swing应用程序,我在EDT上创建了Swing组件。 Executor启动线程,在某些时候将文本插入JTextArea。但是,与InvokeAndWait不同,InvokeLater并不总是执行追加。当我收集它的同步,非阻塞,但仍然应该做追加。怎么会这样?
由于
答案 0 :(得分:4)
使用EventQueue.invokeLater()
从另一个线程更新组件的模型是必要的 - 但不是足够的条件,以实现正确的同步。您仍然需要同步对任何共享数据的访问。在此example中,display()
参数s
是对{em>不可变 final
的{{1}}引用;它可以在String
中安全访问,无需进一步同步。如果您对可变对象有display()
引用,请考虑thread-safe collection。您可以使用引用的here方法之一查找违规行为。或者,考虑SwingWorker
来托管example的后台任务。