我如何安排gui组件的状态读取的gui和线程同步?

时间:2012-04-03 09:33:42

标签: java multithreading user-interface

我想问一个关于同步的问题。 gui线程和另一个读取组件的线程 周期性地说,用Java标记。 情况就是这样,我有gui和一个帖子。我在gui有一个标签。 我有一个线程,周期性地(比如100ms)读取该标签。我认为当gui更改标签并且同时线程尝试读取label(concurrentModificationException错误)时会出现问题。我怎样才能克服这种情况?

1 个答案:

答案 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。您需要了解有关使用SwingUtilitiesSwingWorker

的所有信息

但请注意,Swing组件不会检测(错误的)多线程访问。 Swing组件不会抛出ConcurrentModificationExceptions。如果你得到它,你要么使用Swing以外的Windowing工具包,要么其他代码引发异常。 (如果您使用的是SWT,have a look at this)。