Java 使用SimpleDataFormat在JFreeChart中进行多线程处理
我正在开发一个监控程序,可以连接到远程服务器并获取I/o速率。这是我的密码:Java 使用SimpleDataFormat在JFreeChart中进行多线程处理,java,multithreading,swing,jfreechart,Java,Multithreading,Swing,Jfreechart,我正在开发一个监控程序,可以连接到远程服务器并获取I/o速率。这是我的密码: import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridLayout; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.logging.Level; import java.util.logging.L
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimePeriod;
import org.jfree.data.time.TimeTableXYDataset;
public class IOStat extends JPanel implements Runnable {
FileRW FRW;
Sessionn SES;
String SONUC;
String SUTUN;
String[] st;
int SECIM;
int NODE;
private static final int COUNT = 650;
String deger;
String[] degerler;
Timer timer;
String TITLE;
private static String Y_EKSEN;
private static String X_EKSEN;
String SUTUNLAR = null;
int i;
int sayac;
Thread t;
TimeTableXYDataset dataset;
public IOStat(String title, String yEksen, String xEksen, Sessionn obj, int node, String[] label) {
SES = new Sessionn();
SES.girisYap(obj.USERNAME, obj.PASSWORD, obj.HOSTNAME);
this.setLayout(new GridLayout());
t = new Thread(this, title);
i = 0;
sayac = label.length;
NODE = node;
SES = obj;
Y_EKSEN = yEksen;
X_EKSEN = xEksen;
TITLE = title;
st = label;
dataset = new TimeTableXYDataset();
JFreeChart chart = createAreaChart(dataset);
this.add(new ChartPanel(chart), BorderLayout.CENTER);
t.start();
}
private JFreeChart createAreaChart(TimeTableXYDataset dataset) {
JFreeChart chart = ChartFactory.createStackedXYAreaChart(
TITLE, X_EKSEN, Y_EKSEN, dataset, PlotOrientation.VERTICAL, true, true, false);
DateAxis domainAxis = new DateAxis();
domainAxis.setAutoRange(true);
domainAxis.setDateFormatOverride(new ThreadSafeSimpleDateFormat("HH:mm"));
domainAxis.setTickUnit(new DateTickUnit(DateTickUnitType.MINUTE, 5));
XYPlot plot = (XYPlot) chart.getPlot();
plot.setDomainAxis(domainAxis);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis.setFixedAutoRange(3600000.0); //1 saat
rangeAxis.setNumberFormatOverride(new DecimalFormat("#,###.########"));
rangeAxis.setAutoRange(true);
return chart;
}
public void run() {
try {
while (true) {
TimePeriod period = new Second();
deger = SES.sorguCalistir("ssh " + TITLE + " iostat -k -x 1 2 | perl -e 'local $/=\"\"; @p=<STDIN>; print @p[4];' | awk '{ print $6 \" \" $7}' | grep -v rsec |awk '{ SUM += $1; SUM2 += $2} END { print SUM \" \" SUM2 }'");
degerler=null;
degerler = deger.split(" ");
for (int j = 0; j < 2; j++) {
dataset.add(period, Double.parseDouble(degerler[j]), st[j]);
if (dataset.getItemCount() > COUNT) {
TimePeriod firstItemTime = dataset.getTimePeriod(0);
dataset.remove(firstItemTime, st[j]);
}
}
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
Logger.getLogger(IOStat.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
}
});
}
}
当我将deger
值放入控制台并跟踪它时,输出如下:
run:
deger=
deger=
Exception in thread "alzproddbadm02" Exception in thread "alzproddbadm01" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011)
at java.lang.Double.parseDouble(Double.java:540)
at OsWatch.IOStat.run(IOStat.java:108)
at java.lang.Thread.run(Thread.java:744)
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011)
at java.lang.Double.parseDouble(Double.java:540)
at OsWatch.IOStat.run(IOStat.java:108)
at java.lang.Thread.run(Thread.java:744)
deger=0 0
deger=0 0
deger=0 468
deger=0 468
0 1764
Exception in thread "alzproddbadm04" java.lang.NumberFormatException: For input string: "468
0"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
at OsWatch.IOStat.run(IOStat.java:108)
at java.lang.Thread.run(Thread.java:744)
deger=0 0
deger=0 1104
deger=0 0
deger=0 0
deger=0 696
deger=0 0
deger=0 0
deger=0 0
deger=0 0
deger=0 12
deger=0 0
deger=0 0
BUILD STOPPED (total time: 44 seconds)
我找到了解决办法,我必须删除这条线
SES = obj;
因为它覆盖了我的
SES
对象并导致数据混乱,还会导致会话锁定。您是否为要拆分的数据放置了system.out.println(“deger=“+deger”)以帮助确定问题发生的位置?我放置并编辑了我的问题。如您所见,有时有两个以上的值。这是个问题,因为我的拆分函数只能得到两个值,而不是四个。无关:请学习java命名约定并坚持它们。@D-Klotz,你对此有什么想法吗?最有可能的问题是,你修改了EDT上的数据集,但这并不是你代码中唯一的问题:你必须访问EDT上的所有swing属性(包括数据)。为什么我必须访问所有swing属性?我不明白这个问题-你正在更改线程中的数据集,你不觉得吗?或者是否记录了允许任何线程使用的删除/添加方法?(他们可能会在内部接管EDT切换,不知道;)在JFreeChart中,当数据集值更改时,图表会自动更新。所以,这个解决方案目前有效。但我也必须研究EDT。是的,我知道它们是更新的——问题是谁负责保证EDT的更新。我的赌注是客户机代码(与所有核心swing数据/模型相同)——不过这只是猜测。您最好尽快检查,因为EDT违规迟早会导致难以跟踪/调试的严重错误。祝你好运
SES = obj;