Ich habe ein Java-Programm, das viele kleine Simulationen ausführt. Es läuft ein genetischer Algorithmus, wobei jede Fitness-Funktion eine Simulation ist, die Parameter auf jedem Chromosom verwendet. Jeder dauert vielleicht 10 Sekunden, wenn er alleine läuft, und ich möchte eine ziemlich große Bevölkerungsgröße (sagen wir 100?) Haben. Ich kann die nächste Simulationsrunde erst beginnen, wenn die vorherige beendet ist. Ich habe Zugriff auf eine Maschine mit einer Menge Prozessoren, und ich frage mich, ob ich etwas tun muss, um die Simulationen parallel laufen zu lassen. Ich habe noch nie etwas explizit für Multicore-Prozessoren geschrieben und ich verstehe, dass es eine entmutigende Aufgabe ist.Wie gut ist die JVM bei der Parallelverarbeitung? Wann sollte ich meine eigenen Threads und Runnables erstellen? Warum können sich Threads störend auswirken?
Also das möchte ich gerne wissen: Inwieweit und wie gut parallelisiert die JVM? Ich habe gelesen, dass es Low-Level-Threads erstellt, aber wie schlau ist es? Wie effizient ist das? Würde mein Programm schneller laufen, wenn ich jede Simulation zu einem Thread machen würde? Ich weiß, dass dies ein riesiges Thema ist, aber könnten Sie mich auf einführende Literatur über Parallelverarbeitung und Java hinweisen?
Vielen Dank!
Update: Ok, ich habe einen ExecutorService implementiert und meine kleinen Simulationen implementieren Runnable und run() -Methoden. Statt dies zu schreiben:
Simulator sim = new Simulator(args);
sim.play();
return sim.getResults();
Ich schreibe dies in meinem Konstruktor:
ExecutorService executor = Executors.newFixedThreadPool(32);
Und dann jedes Mal, wenn ich möchte eine neue Simulation auf den Pool hinzufügen, ich laufe dies:
RunnableSimulator rsim = new RunnableSimulator(args);
exectuor.exectue(rsim);
return rsim.getResults();
Die RunnableSimulator::run()
-Methode ruft die Simulator::play()
-Methode auf, beide haben keine Argumente.
Ich glaube, ich bekomme Thread-Interferenz, weil jetzt die Simulationen Fehler aus. Mit einem Fehler meine ich, dass Variablen Werte enthalten, die sie eigentlich nicht sollten. Kein Code aus der Simulation wurde verändert und die Simulation lief vor vielen verschiedenen Argumenten einwandfrei. Die Sim funktioniert so: In jedem Spielzug erhält sie ein Spielstück und durchläuft den gesamten Ort auf dem Spielbrett. Es überprüft, ob der angegebene Ort gültig ist, und falls ja, legt das Stück fest und misst die Güte dieses Brettes. Offensichtlich werden nun ungültige Speicherorte an die Festschreibmethode übergeben, was dazu führt, dass der Index außerhalb der zulässigen Grenzen liegt.
Jede Simulation ist ein eigenes Objekt, oder? Basierend auf dem obigen Code? Ich kann den gleichen Satz von Argumenten an die Klassen RunnableSimulator
und Simulator
übergeben und die ausführbare Version wird Ausnahmen auslösen. Was denkst du könnte dies verursachen und was kann ich tun, um es zu verhindern? Kann ich einige Codebeispiele in einer neuen Frage zur Verfügung stellen?
Ok, ich habe einen ExecutorService implementiert und meine kleinen Simulationen implementieren Runnable und haben run() -Methoden. Statt dies zu schreiben:
Simulator sim = new Simulator(args); sim.play(); return sim.getResults();
Ich schreibe dies:ExecutorService executor = Executors.newFixedThreadPool(32); RunnableSimulator rsim = new RunnableSimulator(args); exectuor.exectue(rsim); return rsim.getResults();
Ich glaube, ich bin immer Thread Störungen, weil jetzt die sims Überschreitungsfehler. – hornairsMit dem Fehler out meine ich, dass Variablen Werte sind, die sie wirklich nicht sein sollten. Kein interner Code wurde geändert und bevor die Simulation perfekt über viele verschiedene Argumente lief. Die Simulation funktioniert folgendermaßen: Sie gibt ein Stück und einen Ort an und überprüft, ob der Ort gültig ist, und wenn ja, wird das Stück gebunden. Jetzt werden offensichtlich ungültige Speicherorte an die Commit-Methode übergeben. Ich bin fast sicher, dass jede Sim ihre eigene Instanz ist, die ganze neue rsim() Sache. – hornairs
Was denkst du könnte dies verursachen und was kann ich tun, um das zu verhindern? Kann ich einige Codebeispiele in einer neuen Frage zur Verfügung stellen? – hornairs