java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads

HPL

Aktives Mitglied
Ich habe eine Übungsaufgabe aus dem Netz gefischt und bearbeitet.

Dort sollten 100 Threads erzeugt werden, die dann alle eine nur ihnen eigene Nummer ausdrucken.

Ich habe dazu zwei Klassen geschrieben - diese:

Java:
class TestThread implements Runnable
{

String s;
public TestThread(String s){ this.s=s;   }

 public void run(){

     System.out.println(this.s);

}

  public static void main(String[] args){

   for(int i=1;i<=100;i++){

   TestThread m = new TestThread(new Integer(i).toString());
   Thread t = new Thread(m);

   t.start();

   }
  }
}


...und diese:

Java:
class TestThread extends Thread{

 String s;
 public TestThread(String s){ this.s = s;  }

 public void run(){   System.out.println(this.s);     }

 public static void main(String[] args)
{
 for(int i=1;i<=100;i++){
      TestThread m = new TestThread(new Integer(i).toString());
      m.start();
   }
}

}


Bei der unteren der beiden ist alles OK durchgelaufen.


Bei der OBEREN jedoch ist nach einigen Durchläufen eine Fehlermeldung aufgetreten (siehe Anhang).

Das Problem ist mit Sicherheit nicht dringend, aber: Wieso war er plötzlich nicht mehr in der Lage, einen neuen "nativen Thread" zu erzeugen? Weiß da jemand was?
 

Anhänge

  • scrot.JPG
    scrot.JPG
    21,1 KB · Aufrufe: 45
Zuletzt bearbeitet:
Bei mir funktioniert das obere?!

Evtl. willst du mal die komplette TestThread.java und TestThread.class irgendwo hochladen?
 
@HoaX:

Entschuldige, beim Kopieren der unteren der beiden Klassen Klassennamen ist wohl der Klassenname verloren gegangen.

Ich habe zudem festgestellt, dass derselbe fehler auch bei der unteren Klasse auftritt, habe aber keine Ahnung, weshalb.


Wenn ich es nämlich so schreibe:

Java:
class TestThread extends Thread{

 String s;
 public TestThread(String s){ this.s=s;

   this.start();
}

  public void run(){  System.out.println(this.s);  }

 public static void main(String[] args){

    for(int i=1;i<=100;i++){
          new TestThread(new Integer(i).toString());
  }
}
}
 
Zuletzt bearbeitet:
Gestern habe ich es getestet, da hat er nach zimelich vielen Durchläufen den java.lang.OutOfMemoryError nicht gebracht. Gerade jetzt habe ich es wieder getestet, da hat er ihn schon beim zweiten Ausführen geworfen. Die Frage ist freilich auch bei diesem Programm, was den Fehler verursachen könnte.
 
Habs mehrmals ausgeführt und gab nie Probleme. Auch als ichs auf Short.MAX_VALUE hochgeschraubt habe. Hab auch zusammen mit Runtime#freeMemory() ausgegeben, er ist (sofern ich das beurteilen kann) immer zwischen 15 und 10 MB geblieben. Natürlich ohne eigene VM-Parameter, Start direkt aus Eclipse.

btw. this.start niemals im Konstruktor einer nicht finalisierten Klasse aufrufen und "new Integer(i).toString()"? :autsch: Integer.valueOf? String.valueOf? Wozu überhaupt umwandeln?
 
Zuletzt bearbeitet:
Habs mehrmals ausgeführt und gab nie Probleme.

Ich greife über Putty auf einen Rechner zu. Vielleicht liegt hat es damit zu tun? Zumal ich das letzte von mir angegebene Programm gestern testete, da gab es irgendwie auch keine Probleme.



btw. this.start niemals im Konstruktor einer nicht finalisierten Klasse aufrufen

Ich werde das natürlich beherzigen, würde in diesem Zusammenhang aber auch gerne mal fragen, wieso this.start nicht in einer nicht finalisierten Klasse aufgerufen werden darf. Wenn ich aus der Klasse weiter vererbe, werden dann die Subklassen etwa auch gestartet? (Ich bin wirklich ein Anfänger...)
 
Ich greife über Putty auf einen Rechner zu. Vielleicht liegt hat es damit zu tun? Zumal ich das letzte von mir angegebene Programm gestern testete, da gab es irgendwie auch keine Probleme.
Denke ich eher nicht. Ich habs eben auch auf meinen vServer getestet, lief bis 100 ohne Probleme. Steure ich auch über PuTTy. Und auf dem habe ich selbst keinen RAM, musste Xmx auf 2 MB runterschrauben, damit es ging.

Ich werde das natürlich beherzigen, würde in diesem Zusammenhang aber auch gerne mal fragen, wieso this.start nicht in einer nicht finalisierten Klasse aufgerufen werden darf. Wenn ich aus der Klasse weiter vererbe, werden dann die Subklassen etwa auch gestartet? (Ich bin wirklich ein Anfänger...)
Klar. Jede Klasse intialisiert ein Exemplar ihrer Superklasse und ruft den Standartkonstruktor auf (sofern einer existiert bzw. per super nicht etwas anderes angegeben wurde.) Und das noch bevor der Subklassen-Konstruktor fertig abgearbeitet wurde. (FindBugs)
 

Neue Themen


Zurück
Oben