Hallo zusammen,
ich habe mal wieder ein kleines Problem mit Java Threads. Ich muss sagen wir mal 100 mal die gleiche sehr zeitaufwändige Berechnung durchführen und dachte mir, das wäre ja toll, wenn ich das auf die 8 Prozessoren die ich zur Verfügung habe aufteilen könnte, so dass ich quasi 8 Berechnungen parallel durchführen kann. Um das Vermitteln eines neuen Threads an eine „freie“ CPU kümmert sich ja die VM soweit ich das in Erfahrung bringen konnte.
Also, was ich bisher gemacht habe: ich habe 2 Klassen geschrieben. Eine (Klasse1) implementiert Runnable und führt in der überschriebenen run() die Berechnung durch. Das passiert mit einem Systemcall über „Runtime.getRuntime().exec(…);“. Die zweite Klasse (Klasse2) startet 8 Threads in folgender Art:
Klasse1 runner = new Runner(this, …);
Thread thread = new Thread(runner);
thread.run();
Klasse2 verfügt über eine Methode, die die nächste Berechnung auf die gleiche Art und Weise startet, wenn sie aufgerufen wird. Dieser Aufruf wird von Klasse1 am Ende der run() aufgerufen, was ja nicht schwer ist, da Klasse1 durch die Übergabe von „this“ aus Klasse2 auf die gleiche Instanz von Klasse2 zugreifen kann.
Die Idee ist, dass 8 Threads gleichzeitig laufen und rechnen, und wenn einer fertig ist, ruft er den nächsten auf.
Problem: es wird nicht auf den Systemcall gewartet. Klasse1 macht den Aufruf des externen Programms und startet direkt den nächsten Thread durch Aufruf der entsprechenden Methode in Klasse2. Wenn ich das ganze in Klasse1 in einen Prozess packe und warte, bis der fertig ist:
Process proc = Runtime.getRuntime().exec(…);
proc.waitFor();
passiert etwas, was ich dachte durch die Threads umgangen zu haben: es wird von den 8 Threads die ich eigentlich starten will nur der erste gestartet (wie oben beschrieben), und Klasse2 wartet dann mit dem Starten des nächsten Threads, bis dieser eine fertig ist. Ich dachte, wenn ich die Berechnung in einen eigenen Thread packe, würde das Programm, das ihn aufgerufen hat, einfach weiterlaufen und eben gerade nicht mehr auf ihn warten.
Hat jemand eine Idee, was hier schief läuft, oder wie ich das Problem (eventuell anders) lösen könnte?
Das zu beschreiben ist irgendwie kompliziert, von daher hoffe ich auch mal, dass mir das irgendwie gelungen ist
Dankeschön schonmal & Gruß
Schorsch