Entwerfen einer Multi-Thread-Matrix in Java

8

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:

  1. Jede lebende Zelle mit weniger als zwei lebenden Nachbarn stirbt, als ob sie durch Unterpopulation verursacht würde.

  2. Jede lebende Zelle mit zwei oder drei lebenden Nachbarn lebt von der nächsten Generation.

  3. Jede lebende Zelle mit mehr als drei lebenden Nachbarn stirbt, als wäre sie überfüllt.

  4. 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!

    
Max Segal 17.06.2015, 13:30
quelle

2 Antworten

1

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%     
Adrian Shum 18.06.2015, 02:10
quelle
1

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.

%Vor%

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.

    
Raniz 18.06.2015 01:47
quelle

Tags und Links