Ich habe eine Matrix, die John Conways Lebenssimulator implementiert, in dem jede Zelle entweder das Leben oder das Fehlen davon repräsentiert.
Jeder Lebenszyklus folgt diesen Regeln:
Jede lebende Zelle mit weniger als zwei lebenden Nachbarn stirbt, als ob sie durch Unterpopulation verursacht würde.
Jede lebende Zelle mit zwei oder drei lebenden Nachbarn lebt von der nächsten Generation.
Jede lebende Zelle mit mehr als drei lebenden Nachbarn stirbt, als wäre sie überfüllt.
Jede tote Zelle mit genau drei lebenden Nachbarn wird wie durch Reproduktion zur lebenden Zelle.
Jede Zelle hat einen -Thread , der die Änderungen nach den oben aufgeführten Regeln durchführt.
Ich habe diese Klassen implementiert:
%Vor% %Vor% %Vor%Mein Problem ist es, die Threads zu synchronisieren: Jede Zelle (ein Thread) muss erst dann ihren Status Leben / Tod ändern, wenn alle Threads ihre Nachbarn überprüft haben. Der Benutzer wird jeden nächsten Lebenszyklus durch Klicken auf eine Schaltfläche aufrufen.
Wie aus der run()
-Methode hervorgeht, ist meine Logik, jede Zelle (Thread) laufen zu lassen und auf den richtigen Aktionszustand zu warten, der durch die Variable currentAction
in LifeMatrix
-Klasse repräsentiert wird Führe die benötigte Aktion aus.
Was ich damit zu tun habe, ist, wie ich diese Nachrichten an die Threads weiterleiten kann, um zu wissen, wann ich warten soll und wann ich die nächste Aktion ausführen soll?
Irgendwelche Vorschläge, um das Design des Programms zu ändern, sind sehr willkommen, solange jede Zelle mit einem separaten Thread implementiert wird!
Die Verwendung einer CyclicBarrier sollte einfach zu verstehen sein:
(aktualisiert, um 2 Barrieren zu verwenden, und verwenden Sie die innere Klasse, um die Zelle kürzer und sauberer aussehen zu lassen)
Pseudo-Code:
%Vor% Ich würde das mit zwei Phaser
lösen s.
Sie verwenden einen Phaser
, um Zyklen zu steuern und einen, um die Zellen zu synchronisieren, wenn sie feststellen, ob sie am Leben sind oder nicht.
Sie steuern die Zyklen, indem Sie den Haupt-Thread auf der cyclePhaser
registrieren lassen.
und haben Sie arrive
darauf, um den nächsten Zyklus zu starten.
Tags und Links java multithreading