TWaver报表工具使用的GUI线程安全问题
一个RCP实现的客户端,服务端传输数据过来客户端就主推到了UI界面,用的是观察者设计模式,在View视图中实现了update方法,这样引来了一个UI线程错误,很偶然会出现数组越界问题,就是没保证UI的变更,没在一条线程的单例下完成。
原先报错的做法是
解决方案是使操作UI的操作给Swing自己去管理,加个SwingUtilities.invokeLater();或SwingUtilities.invokeAndWait();@Overridepublic void update(Observable o, final Object arg) {// TODO Auto-generated method stubSwingUtilities.invokeLater(new Runnable() {public void run() {DB_ConStatus dbConn = (DB_ConStatus)arg;String node = dbConn.getNode();String svrName = dbConn.getSvrName();LineChart lineChart = (LineChart)uiMap.get(node+svrName+"lineChart");if(lineChart==null)return;List<LineItem> items =lineChart.getItems();LineItem red = items.get(0);LineItem green = items.get(1);double max = dbConn.getAll_conn()+20;lineChart.setUpperLimit(max);//最大上线数lineChart.setYScaleValueGap(max/10==0?1:Math.floor(max/10));red.addValue(dbConn.getAll_conn());//最大连接数red.setName("最大连接数("+dbConn.getAll_conn()+")");green.addValue(dbConn.getUsed_conn());//当前连接数green.setName("当前连接数("+dbConn.getUsed_conn()+")");String date = dbConn.getSet_date();String xText = date.substring(8,10)+":"+date.substring(10,12)+":"+date.substring(12,14);lineChart.addXScaleText(xText);//当前时间if (lineChart.valueCount() > 15) {lineChart.removeHead(1);}}});