Autor Thema: Java Problem  (Gelesen 6201 mal)

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Java Problem
« am: 20. Februar 2007, 22:26:22 »
Hy Leute,

ich bin gerade dabei ein Programm mit Hilfe von BlueJ zumachen. Doch leider komme ich momentan nicht weiter. Ich wollte eine Art Benchmark machen, wobei ich schon eine Methode für die Berechnung um die CPU Auszulasten habe. Ich möchte jetzt jedoch das er nach einer bestimmten Zeit die Methode stoppt. Nur leider habe ich bisher keine Möglichkeit gefunden das zumachen.

Ich hoffe ihr habt ne Idee, oder könnt mir nen Link zu ner Doku geben wo etwas darüber steht.
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Marsu1x

  • hat ne DualRadiWakü
  • ***
  • Beiträge: 82
    • Meine Homepage
Re: Java Problem
« Antwort #1 am: 21. Februar 2007, 08:06:39 »
Hi,

willste Dir BlueJ wirklich antun? :-) Eclipse ist da deutlich komfortabler. Aber zu Deinem Problem: Du kannst einen neuen Thread starten, der solange läuft wie eine boolean Variable true ist, den anderen Thread lässt Du einfach so lange schlafen wie Du es brauchst, wenn dieser aufwacht, setzt er die boolean des anderen Threads auf false. Damit bricht der andere Thread ab.
Hier ein Pseudocode dazu:
Klasse Benchmark
public class Benchmark implements Runnable
{
Burner[] bs = null;
private int cpus = 1;
/**
* @param args
*/
public static void main(String[] args)
{
Benchmark be = new Benchmark();
be.cpus = be.getCPUCount();
System.out.println(be.cpus);
be.bs = new Burner[be.cpus];
for(int i=0;i<be.cpus;i++)
be.bs[i] = new Burner();


for(Burner b : be.bs)
{
Thread mainThr = new Thread(b);
mainThr.start();
}


Thread thr = new Thread(be);
thr.start();

}

public void run()
{
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
for(Burner b : this.bs)
{
b.setBoolean(false);
}
System.out.println(cpus);

}

public int getCPUCount()
{
OperatingSystemMXBean sunOperatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
return sunOperatingSystemMXBean.getAvailableProcessors();
}

}

Klasse Burner
public class Burner implements Runnable
{
private boolean isRunning = false;
private long number = 0;
public void run()
{
this.isRunning = true;
while(this.isRunning)
this.doCalculation();
System.out.println("Vorgang abgebrochen");

}

public void setBoolean(boolean b)
{
this.isRunning = b;
}

private void doCalculation()
{
System.out.println("Führe Aktion aus: " + number);
number++;
}

}
         
« Letzte Änderung: 23. Februar 2007, 19:28:24 von Marsu1x »
live long and prosper. thanks for the fish - good-bye
http://uno2007.boeckel-art.de
-------------------------------------
Desktop: Intel Core2Duo E8400, 8196MB, DFI Lanparty, ATI X4850, aircooled

Server:   AMD X2 4400+, 2048MB GSkill, Asus A8N, ATI X1600Pro, aircooled

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #2 am: 22. Februar 2007, 22:44:22 »
Ja BlueJ muss leider sein, weil es nen Projekt für die Schule ist.

So ich habe das ganze mal versucht, aber es klappt nicht. Er startet einfach die Berechnung, und wenn er fertig ist steht dann nur "Vorgang abgebrochen" da.
Ich hab alles versucht, komme aber einfach nicht weiter.
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Marsu1x

  • hat ne DualRadiWakü
  • ***
  • Beiträge: 82
    • Meine Homepage
Re: Java Problem
« Antwort #3 am: 23. Februar 2007, 07:48:10 »
Schreib mal wie Deine Berechnung ausschaut. Dann werde ich es mal probieren.

Gruss
Marsu1x
live long and prosper. thanks for the fish - good-bye
http://uno2007.boeckel-art.de
-------------------------------------
Desktop: Intel Core2Duo E8400, 8196MB, DFI Lanparty, ATI X4850, aircooled

Server:   AMD X2 4400+, 2048MB GSkill, Asus A8N, ATI X1600Pro, aircooled

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #4 am: 23. Februar 2007, 13:52:23 »
Das hier ist die Berechnung:
private void doCalculation()
{
for (int i=0; i<20; i++) {
    System.out.println("number: " + i);
    }
Es ist recht simpel, doch eine Berechnung von z.B. Pi hat gar nicht geklappt, oder ich habe es eher gesagt nicht hinbekommen.

Außerdem finde ich bei der "Hochzählmethode" es für einen Benchmark sehr gut, da man das als Punkteskala nehmen kann. Ein schneller PC wird in 5 sekunden bei z.B. 100000 sein, und ein langsamer vielleicht bei 10000.
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Marsu1x

  • hat ne DualRadiWakü
  • ***
  • Beiträge: 82
    • Meine Homepage
Re: Java Problem
« Antwort #5 am: 23. Februar 2007, 15:28:49 »
Hi,

wie wärs mit:
private void doCalculation()
{
      System.out.println("number: " + number);
      number++;
}

ich habe das obere beispiel angepasst.

Da du ja schon eine Schleife hast, brauchste nicht noch eine. number muss halt ne long int private Variable  sein.
Allerdings bezweifle ich dass Du damit genaue Ergebnisse zurückbekommst, da die arithmetische Operation zu simple ist.


EDIT:Ich habe das obere Beispiel mal implementiert. Ein Kern meiner Dual Core CPU schafft in 2 Sekunden 92000 Additionen und Ausgaben. Vielleicht war Deine Grenze zu klein.


EDIT2: Du könntest Dein Programm noch erweitern, indem Du abfragst, ob das System mehrere CPUs hat (Stichwort hier Sun's Operating MX Bean) und dann entsprechend viele statt einem neuen Thread startest. Allerdings ist die MX Bean erst ab Java 1.6.0 dabei. Und Du müsstest halt die Ausgabe entsprechend markieren.

Gruss
Marsu1x
« Letzte Änderung: 23. Februar 2007, 15:36:48 von Marsu1x »
live long and prosper. thanks for the fish - good-bye
http://uno2007.boeckel-art.de
-------------------------------------
Desktop: Intel Core2Duo E8400, 8196MB, DFI Lanparty, ATI X4850, aircooled

Server:   AMD X2 4400+, 2048MB GSkill, Asus A8N, ATI X1600Pro, aircooled

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #6 am: 23. Februar 2007, 18:51:42 »
Cool! Jetzt funktioniert es, aber ich habe keine Ahnung warum aufeinmal.

Also ich schaffe bei 2sek gerade mal 22000 Additionen, weiß aber gar nicht warum das so niedrig liegt. Mein System siehst du ja in der Signatur, sollte eigentlich schneller sein.

Liegt es vielleicht an BlueJ? Und sowas wie DualCore Support wäre natürlich cool, aber ich muss halt nur mit Bluej arbeiten, und leider habe ich nicht so die Ahnung von Programmierung, dass ich das auch noch hinbekommen würde. Vielleicht kannst du mir ja ne gute Seite oder so empfehlen, wo vielleicht Tipps stehen. Oder mir vielleicht noch ein paar mehr Tipps geben. Eigentlich wollte ich den fertigen Benchmark nachher in ein JavaApplet packen und in die Website integrieren.

Aber schon mal nen großes Dankeschön an dich :respekt:
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Marsu1x

  • hat ne DualRadiWakü
  • ***
  • Beiträge: 82
    • Meine Homepage
Re: Java Problem
« Antwort #7 am: 23. Februar 2007, 19:27:32 »
gute Infoquelle ist das OpenBook bei galileo "Java ist auch eine Insel". Oder eben die Dokumentation von Sun selbst, dort findest Du auch einige Tutorials zu Java.

Wegen der Performance habe ich ja gesagt, dass die Operation als Benchmark nicht geeignet ist. Außerdem solltest Du die Ausgabe von number nur am Ende machen, da auch sie Performanceeinbußen verursacht.

Zu der Anzahl der CPUs sollte folgende Funktion hilfreich sein:
public int getCPUCount()
{
OperatingSystemMXBean sunOperatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
return sunOperatingSystemMXBean.getAvailableProcessors();
}

Ich habe das obere Beispiel nochmals erweitert um Multi CPU Support.


Das mit dem Applet ist ansich auch kein Problem. Dann leitest Du die Benchmark Klasse von JApplet ab und baust ein Textfeld ein, in das Du das Ergebnis dann schreibst.

Gruss
Marsu1x
« Letzte Änderung: 23. Februar 2007, 19:29:04 von Marsu1x »
live long and prosper. thanks for the fish - good-bye
http://uno2007.boeckel-art.de
-------------------------------------
Desktop: Intel Core2Duo E8400, 8196MB, DFI Lanparty, ATI X4850, aircooled

Server:   AMD X2 4400+, 2048MB GSkill, Asus A8N, ATI X1600Pro, aircooled

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #8 am: 27. Februar 2007, 12:24:00 »
Also das mit dem Multi CPU Support funzt leider überhaupt nicht, da ich wohl dafür nicht die nötigen Programme habe, und auch in der Schule diese Programme nciht vorhanden sind. Außerdem haben wir glaube ich in der Schule wo wir es ja nachher vorführen sollen, nur Single Cores^^. Sitze sowieso gerade in der Schule, und habe vergessen die Materialen von zu Hause mitzunehmen *blöd*. Und leider funktioniert dein jetziger Code gar nicht. BlueJ spuckt nur Fehler aus und den Multi CPU Support rauszubekommen aus dem Code ist mir bisher auch nicht gelungen.

Was die Performance angeht, so hatten wir sonst vor eine andere und kompliziertere Rechnung zu machen. Man könnte das ganze dann vielleicht auch so regeln, dass zum Schluß einfach eine Ausgabe der erreichten Punkte erfolgt. So würde man doch Performanceeinbußungen an der Stelle verhindern.
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #9 am: 29. April 2007, 16:45:55 »
So, nach vielen probieren steht jetzt eigentlich unser fertiges Prog^^. Vielen Dank nochmal an dich Marsu1x.
Jedoch habe ich noch ein paar Verständnis Fragen:


- Was bedeutet "implements Runnable", beziehungsweise was macht das?
- Was hat es genau mit dem "public static void main(String[] Start)" auf sich, ich weiß das man dann nen rechtsklick auf die Klasse machen kann und sofort loslegen kann, aber komisch ist auch das ich ihn ja einen Wert eingeben könnte, ich weiß nur nicht wieso.

Also eigentlich wäre es gut wenn du mir nochmal die Klasse Benchmark genauer erklären könntest. Das Funktionsprinzip habe ich denke ich mal verstanden, aber nicht die einzelnen "Befehle" im Detail. Könntest mir sonst auch nen Link geben wo ich mich über "Threads" informieren könnte, sprich du müsstest mir ja nicht alles vorkauen^^.

Hier mal der Code:
Benchmark:
public class Benchmark implements Runnable
{
private Burner b = new Burner();

public static void main(String[] Start)
{
Benchmark be = new Benchmark();
Thread BenchStart = new Thread(be.b);
BenchStart.start();
Thread Stop = new Thread(be);
Stop.start();

}

public void run()
{
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
this.b.setBoolean(false);

}

}

Burner:
public class Burner implements Runnable
{
    private double i = 1;
    private boolean isRunning = true;
    private int schritte = 10000;
    private int treffer = 0;
    private double radius = 1.0;
    private double a, c, entfernung, pi;
    public void run()
     
    {
        this.isRunning = true;
        while(this.isRunning)
            this.doCalculation();
        System.out.println("Ich habe fertig!");
       
   }
   
    public void setBoolean(boolean b)
    {
        this.isRunning = b;
    }
   
    private void doCalculation()
    {
   
    for(int i=0; i < schritte; i++) {
         a = Math.random();
         c = Math.random();
         entfernung = Math.sqrt(a*a + c*c);
         if( entfernung <= radius ) {
            treffer = treffer + 1;
         }
      }
      i++;
      System.out.println("Näherung: "+i);
    }

}
« Letzte Änderung: 29. April 2007, 16:46:56 von Mugga »
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Marsu1x

  • hat ne DualRadiWakü
  • ***
  • Beiträge: 82
    • Meine Homepage
Re: Java Problem
« Antwort #10 am: 29. April 2007, 17:03:56 »
Hallo Mugga,

herzlichen Glückwunsch! :-)

ich fange erst Mal mit Deinen ersten beiden Fragen an, den Code erklären mache ich später. Ich hoffe das ist ok für Dich :-)

mit "implements" sagt man welche Schnittstellen/Interfaces die Klasse implementiert. Eine Schnittstelle beinhaltet die Rümpfe von Methoden, hat also keine eigentliche Funktion. Implementiert eine Klasse nun eine Schnittstelle, muss diese Klasse alle Methoden aus der Schnittstelle (mit den definierten Methodensignaturen) implementieren. Erfüllt nun die Klasse diese Schnittstellenmethoden, kann ein Objekt dieser Klasse mit dem Typ dieser Schnittstelle angesprochen werden. Damit kann man gut Objekte voneinander kapseln. Das Benutzereingabenabfangen in den GUI Anwendungen mit SWT bzw. Swing wird mit solchen Schnittstellen gelöst. Da sind es z.B. die Schnittstellen ActionListener oder MouseListener.
Runnable ist also auch eine Schnittstelle. Sie gibt vor, dass die Klasse, die Runnable implementiert die Methode public void run() anbieten muss. Diese Methode ist die Methode, die von der Java VM aufgerufen wird, wenn ein neuer Thread in einem Objekt der Klasse gestartet wird.

Die Methode public void main(string[] args) ist die Methode, die den Einstieg in ein Programm ermöglicht. In c/c++ gibt es diese Funktion auch: void main(int argc, char** argv) oder int main(int argc, char** argv)
Wenn man also ein c/c++ Programm kompiliert und dann ausführen will, springt der Aufruf immer in die Funktion void main(...). Du kannst jedem Programm auch Parameter übergeben. Genau dafür sind Übergabeparameter gedacht. In c/c++ ist der erste Parameter die Anzahl der Kommandozeilenparameter (wobei hier auch der Name vom Programm selbst mitgezählt wird) und der zweite Parameter ist ein Array von Zeichenketten/Parametern, getrennt durch Leerzeichen. In Java hat man den ersten Parameter weggelassen, da es einfach ist die Länge des Parameterarrays zu ermitteln.

Ich hoffe das war wenigstens etwas verständlich :-) Ich würde Dir aber mal vorschlagen in einer Bibliothek Dir paar C/c++/Java Bücher auszuleihen um Dich Stück für stück in das Thema einzulesen. Da meine Erklärungen vielleicht gut für einzelne Aspekte sind, aber zum Gesamtverständnis (und ohne das gehts einfach nicht) ist solche Literatur unumgänglich. Du könntest Dir auch alternativ auf den Seiten der Professoren des Fachbereichs Informatik der HTWG Konstanz die Skripte zu Programmiertechnik und Algorithmen und Datenstrukturen anschauen, die fand ich damals zum Einstieg recht gut.

Grüsse,
Marsu1x
live long and prosper. thanks for the fish - good-bye
http://uno2007.boeckel-art.de
-------------------------------------
Desktop: Intel Core2Duo E8400, 8196MB, DFI Lanparty, ATI X4850, aircooled

Server:   AMD X2 4400+, 2048MB GSkill, Asus A8N, ATI X1600Pro, aircooled

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #11 am: 29. April 2007, 17:41:22 »
Ja ok also das mit den Implements verstehe ich jetzt schon nen ticken besser, aber woher kommt das runnable? Woher weiß denn Java das ich genau die Methode "run" aus der Klasse Benchmark meine? Also hätte da oben jetzt gestanden "implements run" dann hätte ich es vielleicht verstanden, aber so nicht. Wenn ich aber oben nur "run" hinschreibe, dann sagt er mir "cannot find symbol".

Was "void main" angeht so ist deine Erklärung doch nen bissl zu kompliziert für mich^^, aber eigentlich weiß ich jetzt, dass wenn "static" im "Methodenkopf" (weiß nicht wie man das genau nennt), dann kann ich bei BlueJ über nen Rechtsklick sofort alles starten, ohne vorher eine neue Instanz von Benchmark zu erstellen und dann einzeln die Methoden ausführen. Das ich das verstanden habe langt mir. Wir brauchen das nicht so genau wissen, denn unsere Lehrerin ist eh zu dumm zum programmieren, ist schon echt schlimm das solche Leute Unterricht geben. Hier mal nen Zitat: "Macht mal nen Shortscreen von eurem Java Code". Ja ne ist schon klar nen Shortscreen :laughing:

Komisch finde ich nur noch etwas anderes, und zwar haben wir in der Schule mal rumgetestet mit der Klasse Burner. Ich habe die PI Berechnung einfach 2x in die Methode kopiert. Das komische dabei ist, dass beim Benchen die CPU Auslastung runtergeht, dafür die Punktezahl aber niedriger wird. Also das die Punktezahl runtergeht ist ja eigentlich logisch, aber warum die CPU Auslastung geringer wird, ist mir ein Rätsel. Jedoch sind bei 2x PI Berechnungen die Punkteabweichungen bei mehreren Durchläufen sehr gering, und liegt nur noch im Promillebereich.

Was ich ebenfalls sehr erstaunlich finde ist, dass wenn ich meine CPU um ca. 400 Mhz übertakte die Punktezahl mal eben 1000 Punkte höher liegt. Ebenfalls ziemlich lustig finde ich das mein Kumpel mit seinen Athlon64@2,9Ghz noch unter der Punktzahl meiner CPU liegt @1,5Ghz.
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"

Offline Marsu1x

  • hat ne DualRadiWakü
  • ***
  • Beiträge: 82
    • Meine Homepage
Re: Java Problem
« Antwort #12 am: 29. April 2007, 17:47:59 »
Eine Schnittstelle ist eine Sammlung von Methodenrümpfen. Du implementierst NICHT die Methode run(), sondern die ganze Schnittstelle, deshalb das "implements runnable". Die Schnittstelle runnable hat eben nur die eine Methode run() definiert.


gruss MArsu1x
live long and prosper. thanks for the fish - good-bye
http://uno2007.boeckel-art.de
-------------------------------------
Desktop: Intel Core2Duo E8400, 8196MB, DFI Lanparty, ATI X4850, aircooled

Server:   AMD X2 4400+, 2048MB GSkill, Asus A8N, ATI X1600Pro, aircooled

Offline Mugga

  • hat ne Kompressorkühlung
  • *
  • Beiträge: 525
Re: Java Problem
« Antwort #13 am: 29. April 2007, 20:16:00 »
Aja, jetzt verstehe ich, hatte auch nochmal ein bissl gegoogelt. Also sprich das wenn ich mit dem "implements runnable" arbeite, dann ist dieses "void run" sozusagen vordefiniert.
CPU: Intel Q6600@3Ghz@1,33 Mobo: Gigabyte P35 DS3P Ram: G.Skill 4096MB Netzeil: BeQuiet DarkPower 500W Graka: BFG 8800GTX@648mhz/1000mhz HDD: 1xRaptor74GB@Dämmbox 2xSamsung HD501LJ 500GB@Dämmbox Sound: Creative X-Fi Platinium@Teufel Concept G THX 7.1 Kühlung: Modded TT Symphony+SingleRadi+Laing Pro+ZernPQ+AquagraFX 8800GTX "silber exoliert"