Aufgabe 7.4 - Schlangensortiertung

Abprüfen der Änderungen klappt nicht

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 7.4 - Schlangensortiertung
Hallo zusammen!

Seit zwei Tagen kämpfe ich mit dieser Aufgabe, genauer gesagt, mit dem Hinweis “Zum Abprüfen auf Änderungen empfiehlt es sich, erst lokal für jeden Arbeiter zu merken, ob er Änderungen vorgenommen hat, und erst am Schluss diese Erkenntnis an die anderen Arbeiter bekannt zu geben!”

Meine Vorgehensweise:

Meine Runnable verfügt über ein “static AtomicBoolean”, welches den Wert “false” hat.
Ich packe den Rumpf der ganzen run()-Methode in eine while-Schleife und zwar so (Pseudocode):

public void run() { while (myAtomicBoolean = false) { myAtomicBoolean = true; (Hier kommt der Part, in dem die Sortierung zeilen- bzw. spaltenweise stattfindet. Wenn sortiert werden muss, folgt die Anweisung "myAtomicBoolean = false". Auf diese Weise läuft die while-Schleife nur dann wieder, wenn tatsächlich sortiert wurde.) }

Problem: Bei mehr als einem Thread ist es nicht gewährleistet, dass das Programm überhaupt läuft. Es hängt sich spontan auf. Ich vermute, das Einklammern von run()-Rumpf in die while()-Schleife ist ein völlig falscher Ansatz, weiß aber nach so vielen Stunden einfach nicht weiter. :-/ Hat irgendwer vielleicht einen Rat für mich?

Vielen Dank im Voraus! :slight_smile:


also ich hab für jeden thread eine eigene boolean variable und wenn sich alle an der barrier treffen überprüft ein master-runnable ob alle false sind. Denk dran bei der Erstellung einer Barrier kannst du optional ein Runnable übergeben, welches ausgeführt wird nachdem sich alle getroffen haben und bevor es weiter geht. Sehr nützlich in dem Fall


Für die Schlangensortierung brauchst du auch einen globalen Zustand den sich alle Threads teilen. Wenn Thread 1 nichts ändert aber Thread 2 schon, dann darf Thread 1 sich nicht beenden, da er beim nächsten Sortierschritt wieder gebraucht wird. Du musst also global die Änderungen der einzelnen Threads sammeln und erst wenn keiner der Threads Änderungen feststellt dürfen sich alle beenden. Verwendet man einen globalen boolean innerhalb der While-Bedingung muss man darauf achten keine Race Condition zu schreiben. Dafür eigenen sich unter anderem die Barrieren. Hoffe das hilft dir weiter :wink:


Bei mir werden die Threads von einem Masterthread beendet der entscheidet ob fertig oder nicht, aber ja irgendwoher muss kommen ob fertig.


Geht natürlich genauso, aber das hab ich jetzt spontan für die kompliziertere Version gehalten :wink: