如何克服GUI中介中的并发修改异常?

时间:2011-02-04 23:31:59

标签: java exception concurrency mediator

仅供参考我在Swing on Java上采用了GUI的中介模式。

不幸的是,如果用户输入需要新窗口,则总是抛出并发修改异常。

这是因为我的代码尝试在处理来自现有同事(窗口)的用户输入的过程中向调解员的同事列表添加新同事(新窗口)。

e.g。

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);
        }       
}

是否有其他处理结构可以添加我可以采用的新同事?提前感谢任何建议或想法。

2 个答案:

答案 0 :(得分:1)

一种选择可能是采用Swing-esque模型,让你的中介存储一个更新的“事件队列”,它需要在时机成熟时进行。这样,当您在处理来自其他对象的事件时添加新窗口时,该窗口不会使逻辑失效。它只是被添加到“完成后处理这个”队列,在完成中介后得到处理。

另一个选择是在迭代之前复制列表,这样在迭代期间对原始结构所做的更改不会显示在迭代列表中。

另一个想法是使用一些非迭代器技术来访问元素。例如,如果您将窗口存储在列表中,则可以像这样使用for循环:

for (int i = 0; i < elems.size(); ++i)
    /* ... */

不会引发这些异常。

答案 1 :(得分:1)

如果遍历数量远远超过修改数量,那么像CopyOnWriteArrayList这样的写时复制数据结构可能适用。