Java 使用SimpleDataFormat在JFreeChart中进行多线程处理

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

我正在开发一个监控程序,可以连接到远程服务器并获取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.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;