Reputation: 938
I'm trying to monitor a group of computer resources online. In order to do that, i'm using JFreechart and try to use multithreading in order to gain performance.
Here is my code:
class osGenel extends JPanel implements Runnable {
String name;
private static DefaultValueDataset[] DATASET;
Integer VALUE,iii,sayac;
Thread t;
private static Sessionn[] obj;
osGenel(String s,DefaultValueDataset valuedataset,Double n,Double w,Double c,int i) {
name = s;
iii=i;
t = new Thread(this, name);
this.setLayout(new GridLayout());
DATASET[iii]=valuedataset;
MeterPlot meterplot = new MeterPlot(DATASET[iii]);
meterplot.setDialShape(DialShape.CIRCLE);
meterplot.setRange(new Range(0.0D, 100D));
meterplot.addInterval(new MeterInterval("Normal", new Range(0.0D, n), Color.lightGray, new BasicStroke(2.0F),Color.GREEN));
meterplot.addInterval(new MeterInterval("Warning", new Range(n, w), Color.lightGray, new BasicStroke(2.0F), Color.YELLOW));
meterplot.addInterval(new MeterInterval("Critical", new Range(w, c), Color.lightGray, new BasicStroke(2.0F), Color.RED));
meterplot.setNeedlePaint(Color.darkGray);
meterplot.setDialBackgroundPaint(Color.white);
meterplot.setDialOutlinePaint(Color.gray);
meterplot.setMeterAngle(260);
meterplot.setTickLabelsVisible(true);
meterplot.setTickLabelFont(new Font("Dialog", 1,25));
meterplot.setTickLabelPaint(Color.darkGray);
meterplot.setTickSize(5D);
meterplot.setBackgroundPaint(Color.black);
meterplot.setTickPaint(Color.lightGray);
meterplot.setValuePaint(Color.black);
meterplot.setValueFont(new Font("Dialog", 1, 0));
JFreeChart chart = new JFreeChart(s, JFreeChart.DEFAULT_TITLE_FONT, meterplot, true);
this.add(new ChartPanel(chart, false));
t.start();
}
public void run() {
try {
for (int i = 100; i > 0; i--) {
System.out.println(iii + ". Thread running");
Random r=new Random();
DATASET[iii].setValue(r.nextInt(100));
Thread.sleep(3000);
}
} catch (InterruptedException e) {
System.out.println(name + "Interrupted");
}
System.out.println(name + " Out.");
}
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DefaultValueDataset defaultvaluedataset = new DefaultValueDataset(23D);
final JFrame f = new JFrame("OS MONITOR");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
obj=new Sessionn[9];
DATASET=new DefaultValueDataset[9];
f.setLayout(new GridLayout(3, 3));
f.add(new osGenel("CPU", defaultvaluedataset,60D,90D,100D,0));
f.add(new osGenel("DISK", defaultvaluedataset,60D,90D,100D,1));
f.add(new osGenel("MEMORY", defaultvaluedataset,60D,90D,100D,2));
f.add(new osGenel("CPU", defaultvaluedataset,60D,90D,100D,3));
f.add(new osGenel("DISK", defaultvaluedataset,60D,90D,100D,4));
f.add(new osGenel("MEMORY", defaultvaluedataset,60D,90D,100D,5));
f.add(new osGenel("CPU", defaultvaluedataset,60D,90D,100D,6));
f.add(new osGenel("DISK", defaultvaluedataset,60D,90D,100D,7));
f.add(new osGenel("MEMORY", defaultvaluedataset,60D,90D,100D,8));
f.pack();
f.setVisible(true);
}
});
}
}
The problem is, when i run this program, my threads are working, in each thread there is different value, but my datasets always get same value from these threads. I thought my each dataset will get different value, but it doesn't. All graphs show same value with each thread works.
Upvotes: 0
Views: 632
Reputation: 54639
JFreeChart is a Swing library, and it is NOT threadsafe. Whatever you want to achieve, you should more clearly describe your intention, where you assume that performance issues come from, and how you intend to improve the performance with threads.
However, the reason for the observed behavior is the following:
All the DefaultValueDataset
instances in the DATASET
array are identical. There is only one instance of DefaultValueDataset
, and this instance is stored 9 times in the array.
You could change your initialization to something like
final JFrame f = new JFrame("OS MONITOR");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
obj=new Sessionn[9];
DATASET=new DefaultValueDataset[9];
for (int i=0; i<DATASET.length)
{
DATASET[i] = new DefaultValueDataset(23D);
}
f.setLayout(new GridLayout(3, 3));
f.add(new osGenel("CPU", DATASET[0],60D,90D,100D,0));
f.add(new osGenel("DISK", DATASET[1],60D,90D,100D,1));
f.add(new osGenel("MEMORY", DATASET[2],60D,90D,100D,2));
f.add(new osGenel("CPU", DATASET[3],60D,90D,100D,3));
f.add(new osGenel("DISK", DATASET[4],60D,90D,100D,4));
f.add(new osGenel("MEMORY", DATASET[5],60D,90D,100D,5));
f.add(new osGenel("CPU", DATASET[6],60D,90D,100D,6));
f.add(new osGenel("DISK", DATASET[7],60D,90D,100D,7));
f.add(new osGenel("MEMORY", DATASET[8],60D,90D,100D,8));
but some further cleanups might be appropriate, and again: JFreeChart is NOT thread safe!
Upvotes: 2
Reputation: 10994
You have one big problem, you use one instance of DefaultValueDataset
for all your threads, in next code :
DefaultValueDataset defaultvaluedataset = new DefaultValueDataset(23D);
f.add(new osGenel("CPU", defaultvaluedataset,60D,90D,100D,0));
f.add(new osGenel("DISK", defaultvaluedataset,60D,90D,100D,1));
f.add(new osGenel("MEMORY", defaultvaluedataset,60D,90D,100D,2));
f.add(new osGenel("CPU", defaultvaluedataset,60D,90D,100D,3));
f.add(new osGenel("DISK", defaultvaluedataset,60D,90D,100D,4));
f.add(new osGenel("MEMORY", defaultvaluedataset,60D,90D,100D,5));
f.add(new osGenel("CPU", defaultvaluedataset,60D,90D,100D,6));
f.add(new osGenel("DISK", defaultvaluedataset,60D,90D,100D,7));
f.add(new osGenel("MEMORY", defaultvaluedataset,60D,90D,100D,8));
Because of that, you have the same result in each panel.
Change that code to:
f.add(new Test("CPU", new DefaultValueDataset(23D), 60D, 90D, 100D, 0));
f.add(new Test("DISK", new DefaultValueDataset(23D), 60D, 90D, 100D, 1));
f.add(new Test("MEMORY", new DefaultValueDataset(23D), 60D, 90D, 100D, 2));
f.add(new Test("CPU", new DefaultValueDataset(23D), 60D, 90D, 100D, 3));
f.add(new Test("DISK", new DefaultValueDataset(23D), 60D, 90D, 100D, 4));
f.add(new Test("MEMORY", new DefaultValueDataset(23D), 60D, 90D, 100D, 5));
f.add(new Test("CPU", new DefaultValueDataset(23D), 60D, 90D, 100D, 6));
f.add(new Test("DISK", new DefaultValueDataset(23D), 60D, 90D, 100D, 7));
f.add(new Test("MEMORY", new DefaultValueDataset(23D), 60D, 90D, 100D, 8));
And you see expected result.
Upvotes: 2