调度程序线程上的线程更新GUI会导致异常

时间:2014-10-08 16:22:00

标签: java multithreading swing

我有2个线程,一个是运行我的应用程序的“服务器”的线程,另一个是GUI的事件调度程序,如下所示:

    public static void main(String[] args) 
    {
    //Connections
    Runnable r2 = new Runnable() {
        @Override
        public void run() 
        {
            App.connectToServer();
        }
    };


    //Launch main window
    SwingUtilities.invokeLater(new Runnable() {
        public void run() 
        {
            //Installs theme
            WebLookAndFeel.install();

            //Launches main window
            BootWindow myMainWindow = new BootWindow();
        }
    });

    Thread thr2 = new Thread(r2);
    thr2.start();
}

//Get instance
public static App getInstance()
{
    if ( instance == null )
    {
        // Creating window instance
        instance = new App();
    }
    return instance;
}

//Server connections
private static void connectToServer()
{
    System.out.println("Connecting to the eTrade Manager Server..");
    etmServer server = new etmServer();
    server.connectEtmServer();

}

在app的服务器线程中,有一个方法可以侦听来自服务器的新消息,然后该方法在GUI的线程中调用updateStatus方法,并尝试更新面板的背景颜色:

正在倾听的方法:

@Override
public void ProcessSystemStatus(SystemStatusUpdateWrapper systemUpdate) 
{
    System.out.println("----System Update----");
    System.out.println("Connection ID: " + systemUpdate.getConnectionId());
    System.out.println("System Status: " + systemUpdate.getSystemStatus());
    System.out.println("Risk State: " + systemUpdate.getRiskState());
    System.out.println("---------End---------");

    Summary smryWindow = new Summary();
    smryWindow.updateStatus("Qtime", systemUpdate.getSystemStatus());
}

GUI线程中的更新方法

public void updateStatus(String panelName, String status)
{
    if(panelName == "Qtime")
    {
        if(status == "ENABLED")
        {
            qtimeStatusPanel.setBackground(Color.GREEN);

            try
            {
                qtimeStatusPanel.validate();
                qtimeStatusPanel.repaint();
            }
            catch (Exception ex)
            {
                System.err.println(ex.getMessage());
            }
        }
        else
        {
            qtimeStatusPanel.setBackground(Color.RED);
        }

    }
}

当调用updateStatus时,它会引发异常:

java.util.ConcurrentModificationException
at java.util.WeakHashMap$HashIterator.nextEntry(WeakHashMap.java:762)
at java.util.WeakHashMap$EntryIterator.next(WeakHashMap.java:801)
at java.util.WeakHashMap$EntryIterator.next(WeakHashMap.java:799)
at com.alee.managers.style.StyleManager.applySkin(StyleManager.java:300)

我不知道如何处理这个,有什么建议吗?

1 个答案:

答案 0 :(得分:1)

WeakHashMap API指定“如果在创建迭代器后的任何时候对映射进行结构修改,除了通过迭代器自己的remove()方法之外, 迭代器将抛出ConcurrentModificationException。“验证您是否正在使用迭代器,如here所示。

您的程序也可能未正确同步。您可以使用event dispatch thread更新EventQueue.invokeLater()上的GUI,如图here所示。