朋友,我正在开发一个Java应用程序。多数民众赞成在性能监控。关于这一点,我在一类中获得价值,而在另一类中绘制图表。我想使用swingworker交替执行这两个课程。
ResultSet rs; Connection conn = null; conn = (Connection)getMySqlConnection(); Statement st = conn.createStatement(); rs = st.executeQuery("SHOW GLOBAL STATUS"); while(rs.next()) { Map_MySql.put(rs.getString(1), rs.getString(2)); } conn.close();
上面的类用于收集服务器状态并将其存储在哈希图中。该类称为“ MySQLClass”。
System.out.println("Graph Occur"); XYDataset Dataset; TimeSeries Series = new TimeSeries("Random Data"); Second sec = new Second(); ChartPanel CPanel; if(Operation_Combo.getSelectedItem().toString() == "MySQL") { if(MySQLClass.Map_MySql.get(""+MainWindow.SelectedNode+"") == null) { Value = 0; } else { Value = Integer.parseInt(MySQLClass.Map_MySql.get(""+MainWindow.SelectedNode+"")); } System.out.println(Value); } if(Operation_Combo.getSelectedItem().toString() == "SQL Server") { if(SqlServerClass.Map_SQLServer.get(""+MainWindow.SelectedNode+"") == null) { Value = 0; } else { Value = Integer.parseInt(SqlServerClass.Map_SQLServer.get(""+MainWindow.SelectedNode+"")); } System.out.println(Value); } String CounterName = MainWindow.SelectedNode.toString(); Series.add(sec, Value); Dataset = new TimeSeriesCollection(Series); Chart = ChartFactory.createTimeSeriesChart(CounterName, "Time", "Range", Dataset, true, false, false); XYPlot Plot = (XYPlot)Chart.getPlot(); Plot.setBackgroundPaint(Color.LIGHT_GRAY); Plot.setDomainGridlinePaint(Color.WHITE); Plot.setRangeGridlinePaint(Color.RED); CPanel = new ChartPanel(Chart); Panel1.revalidate(); Panel1.add(CPanel); System.out.println("Chart Added"); Panel1.validate(); Panel1.repaint(); Thread.sleep((int)MainWindow.Interval_Combo.getSelectedItem() * 1000); System.out.println("Sleep="+((int)MainWindow.Interval_Combo.getSelectedItem() * 1000)); System.gc();
上面的代码是在一个称为“ Graph”的类中绘制Graph的代码。我该如何使用Swing Worker交替执行此操作并在每次迭代中绘制图形。如果您知道,请帮助我。
SwingWorker
看起来很简单。
基本上,您需要对要实现的目标做出一些基本决策。
您是否要在运行过程中定期返回更新?
您要返回过程的结果...还是同时返回?
您要提供进度更新吗?
根据您要执行的操作,将更改声明SwingWorker的方式。
例如...
public class HardWorker extends SwingWorker<ReturnValueType, PeriodicalType> {
where ReturnValueType
是工作人员将生成的最终结果,并且PeriodicalType
是您要执行定期更新(可以指定自己的值)时可以发送回UI线程的对象的类型。
您可以指定Void
或Object
为任何一个值,你应该不在乎
执行该方法时,SwingWorker
will调用doInBackground
,该方法将在其自己的线程中调用,从而可以在Event Dispatching Thread之外执行长时间运行的任务。
如果要在doInBackground
方法完成之前将值发送回UI ,可以调用publish(instanceOfPeriodicalType)
。最终,传递给该方法的值将传递给该process
方法。
由于可能将多个项目发送到该publish
方法,因此该process
方法提供了一个List<PeriodicalType>
参数。调用时,此方法将在EDT的上下文中执行,从而使您可以更新UI。
一旦doInBackground
完成,它将return
返回类型的返回值ReturnValueType
(或者null
如果您不在乎)。
如果您对此结果感兴趣,则应使用SwingWorker#get
,但应注意,该方法将阻塞直到doInBackground
返回,这意味着在您知道该doInBackground
方法已返回之前,不要在EDT中调用此方法。您可以使用它isDone
或isCancelled
方法检查工作程序的状态,或者...
您可以使用PropertyChangeListener
和监视state
属性,也可以覆盖的done
方法SwingWorker
。
如果要提供进度更新,则可以在doInBackground
方法中调用setProgress
来更新工作程序的进度。这将触发一个PropertyChangeEvent
命名的progress
,您可以通过使用来监视它PropertyChangeListener
。将在EDT的上下文中调用此侦听器。
看一眼:
摇摆工人
工作线程和SwingWorker
更多细节。
通常,为了使用SwingWorker
,您想要做的是将您的设计分成两组。EDT中可以在后台完成的所有操作以及需要完成的所有操作。
您可以开始构建员工的基本概念。
基本示例...
这有很多假设。基本上,它假定已经设置了UI,并且它将用于挑选新结果并将其传递回特定系列。
基本上,根据需要,将对工人进行骚扰,并将其传递给它。
GraphWorker worker = new GraphWorker(series); worker.execute();
然后,工作将执行查询并将结果传递回process
方法
public class GraphWorker extends SwingWorker<Void, String[]> { private TimeSeries series; private Second sec; public GraphWorker(TimeSeries series) { this.series = series; sec = new Second(); } @Override protected Void doInBackground() throws Exception { ResultSet rs; Connection conn = null; try { conn = (Connection) getMySqlConnection(); Statement st = conn.createStatement(); rs = st.executeQuery("SHOW GLOBAL STATUS"); while (rs.next()) { publish(new String[]{rs.getString(1), rs.getString(2)}); } } finally { conn.close(); } return null; } @Override protected void process(List<String[]> chunks) { for (String[] value : chunks) { try { int iValue = Integer.parseInt(value[1]); series.add(sec, Value); } catch (NumberFormatException exp) { exp.printStackTrace(); } } } }