![](/img/trans.png)
[英]How can I implement thread synchronization in word count tool GUI-based project
[英]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并发性的教程 。 它具有您学习SwingUtilities
和SwingWorker
。
但是请注意,Swing组件不会做任何事情来检测(错误的)多线程访问。 Swing组件不会抛出ConcurrentModificationExceptions
。 如果得到了,则说明您正在使用除Swing以外的Windowing工具包,或者其他一些代码引发了异常。 (如果您使用的是SWT,请查看此 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.