我想问一个关于同步的问题。 gui线程和另一个读取组件的线程 周期性地说,用Java标记。 情况就是这样,我有gui和一个帖子。我在gui有一个标签。 我有一个线程,周期性地(比如100ms)读取该标签。我认为当gui更改标签并且同时线程尝试读取label(concurrentModificationException错误)时会出现问题。我怎样才能克服这种情况?
答案 0 :(得分:4)
除非在Javadocs中另有明确说明,否则Swing组件(假设您正在谈论Swing)不是线程安全的。它们只能由Event Dispatch Thread(EDT)操纵。
如果你想从另一个线程中操作Swing组件,有几种方法可以做到,包括SwingUtilities.invokeLater()
,SwingUtilities.invokeAndWait()
和SwingWorker
(这些方法实际上并不操作来自另一个线程的组件 - 它们只是很容易与EDT协调。)
SwingUtilities.invokeLater()
和invokeAndWait()
允许您将Runnable
传递给他们,并让事件调度线程为您运行它们。 SwingWorker
允许您创建一个任务并将其分成两部分:一部分是长时间运行而不应该在EDT中运行的部分,以及一部分在后台工作后在EDT中完成的工作已经完成了。
这是一个tutorial on concurrency with Swing。您需要了解有关使用SwingUtilities
和SwingWorker
。
但请注意,Swing组件不会检测(错误的)多线程访问。 Swing组件不会抛出ConcurrentModificationExceptions
。如果你得到它,你要么使用Swing以外的Windowing工具包,要么其他代码引发异常。 (如果您使用的是SWT,have a look at this)。