2011-02-04 63 views
3

僅供參考我在Java的Swing中爲我的GUI採用了中介模式。如何克服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); 
     }  
} 

是否有其他一些處理結構可以添加新的同事,我可以採用?提前感謝您的任何建議或意見。

回答

1

一個選項可能是採用Swing-esque模型,並讓您的中介器存儲一個時間合適時需要做出的更新的「事件隊列」。這樣,當您在處理來自其他對象的事件時添加新窗口時,該窗口不會粘住邏輯。它只是被添加到「完成後處理」隊列中,在調解完成後得到處理。

另一種選擇是在迭代之前複製一份列表,以便在迭代過程中對原始結構所做的更改不會顯示在正在迭代的列表中。

另一個想法是使用一些非迭代器技術訪問元素。例如,如果您將窗口存儲在列表中,則可以使用如下所示的for循環:

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

它不會拋出這類異常。

+0

+1對於非常有幫助的替代品!謝謝。 – Arvanem 2011-02-04 23:53:17

1

如果遍歷遠遠超過修改,寫入時複製數據結構(如CopyOnWriteArrayList)可能適合。

+1

+1提供一個非常有趣的建議!謝謝。 – Arvanem 2011-02-04 23:54:08