繁体   English   中英

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

[英]how can i arrange gui and thread synchronization of gui component's state reading?

我想问一个关于同步的问题。 gui线程和另一个定期读取组件状态的线程的代码,例如Java中的label。 在这种情况下,我有gui和一个线程。 而且我在gui中有一个标签。 我有一个线程定期(例如100毫秒)读取该标签。 我认为当gui更改标签并同时线程尝试读取标签时会出现问题(concurrentModificationException错误)。 我该如何克服这种情况?

除非Javadocs中另有明确说明,否则Swing组件(假设您在谈论Swing)不是线程安全的。 它们只能由事件调度线程 (EDT)操纵。

如果要从另一个线程操纵Swing组件,可以采用几种方法,包括SwingUtilities.invokeLater()SwingUtilities.invokeAndWait()SwingWorker (它们实际上并不从另一个线程操纵组件,它们只是在操作使其易于与EDT协调)。

SwingUtilities.invokeLater()invokeAndWait()允许您将Runnable传递给它们,并让Event Dispatch Thread为您运行它们。 SwingWorker允许您创建任务并将其分为两部分:长期运行且不应在EDT中运行的部分,以及在后台作业完成后在EDT中进行的工作的一部分。

这是有关Swing并发性教程 它具有您学习SwingUtilitiesSwingWorker

但是请注意,Swing组件不会做任何事情来检测(错误的)多线程访问。 Swing组件不会抛出ConcurrentModificationExceptions 如果得到了,则说明您正在使用除Swing以外的Windowing工具包,或者其他一些代码引发了异常。 (如果您使用的是SWT,请查看此 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM