首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java swing并发性,多个属性concurrency?

Java swing并发性,多个属性concurrency?
EN

Stack Overflow用户
提问于 2017-10-07 00:26:20
回答 1查看 98关注 0票数 1

我有一个名为DataPanel的面板,它扩展了JPanel,还有一个名为DataPanelWorker的worker,它扩展了SwingWorker。

目前,当我创建DataPanel时,我会启动DataPanelWorker,它会执行一些计算,并在每次计算后触发属性更改。

DataPanel侦听这些属性更改,并每次显示一条消息。例如:“计算%1完成”“计算%2完成”

这可以很好地工作!

我现在想要做的是创建DataPanel的第二个实例(让我们称它为DataPanel2),但我想使用原始的DataPanelWorker来节省计算。我在DataPanelWorker上将DataPanel2注册为另一个propertyChangeListener。

我的问题是,我可能会在计算1完成并触发第一个propertyChangeEvent之后注册DataPanel2。我如何才能知道worker走了多远,才能让DataPanel2显示与DataPanel1相同的消息?

理想情况下,我希望保留一个propertyChangeEvents队列,当注册一个新组件时,只在该组件上触发它们。有没有标准的方法来做这件事?或者我从错误的角度来看待它?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-10-07 02:58:53

从概念上讲,您的SwingWorker应该publish() Calculation的临时实例,以便process()可以更新您的DataModel并通知任何侦听器。

代码语言:javascript
复制
class DataPanelWorker extends SwingWorker<List<Calculation>, Calculation> {…}
class DataModel {
    private List<Calculation> list = new ArrayList<>();
    …
}

然后,您的process()实现可以在事件分派线程上更新您的DataModel。通过这种方式,您的DataModel始终具有计算的完整状态。任何侦听DataPanel都可以向DataModel请求要显示的当前List<Calculation>。您的DataModel可以使用here所示的任何方法通知侦听器新数据的到达。此example更新JLabel;此example还更新图表;此example更新侦听JTableTableModel

DataPanelWorker…执行一些计算,并在每次计算后触发属性更改。

避免在doInBackground()实现中触发属性更改事件,因为对任何共享数据的访问都需要独立于工作线程进行同步。相反,在您的process()实现中更新您的DataModel,这将为您同步访问。然后,DataModel可以为已注册的侦听器激发事件,因为它知道更新将在事件分派线程上发生。

有没有暂停doInBackground()线程的方法?

这是允许的,但您不应该在此上下文中这样做。如有必要,多个工作进程可以按照here所示进行协作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46610100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档