[英]How can one overcome a concurrent modification exception in a GUI mediator?
仅供参考我在Swing on Java上采用了GUI的中介模式。
不幸的是,如果用户输入需要新窗口,则总是抛出并发修改异常。
这是因为我的代码尝试在处理来自现有同事(窗口)的用户输入的过程中向调解员的同事列表添加新同事(新窗口)。
例如
public MainScreenColleague implements GuiColleague, ActionListener {
private GuiMediator mediator;
public MainScreenColleague(GuiMediator medi) {
mediator = medi;
// implement JFrame with JButtons
}
public conveyInputToMediator(EventObject event) {
mediator.conveyInputToColleagues(event);
}
public receiveInputFromMediator(EventObject event) {
if (event.getSource() = particularBtn) {
GuiColleague particularColleague = new ParticularConcreteColleague(mediator);
//THIS IS THE CODE THAT THROWS CONCURRENCY EXCEPTION
mediator.addGuiColleague(particularColleague);
}
}
是否有其他处理结构可以增加我可以采用的新同事? 提前感谢任何建议或想法。
一种选择可能是采用Swing-esque模型,让调解器存储一个更新的“事件队列”,当时机成熟时需要进行更新。 这样,当您在处理来自其他对象的事件时添加新窗口时,该窗口不会使逻辑失效。 它只是被添加到“完成后处理这个”队列,在完成中介后得到处理。
另一种选择是在迭代之前制作列表的副本,以便在迭代期间对原始结构所做的更改不会显示在正在迭代的列表中。
另一个想法是使用一些非迭代器技术来访问元素。 例如,如果您将窗口存储在列表中,则可以像这样使用for循环:
for (int i = 0; i < elems.size(); ++i)
/* ... */
这不会引发这些异常。
如果遍历数量远远多于修改,则CopyOnWriteArrayList之类的写时复制数据结构可能适合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.