Monitor als Schranke von Threads

BodyLAB

Bekanntes Mitglied
Hallo zusammen,

wir haben eine Aufgabe bekommen und ich kann leider nicht so wirklich etwas damit anfangen.
Die Aufgabenstellung lautet:
Implementieren Sie einen Monitor in Java.
Dieser Monitor verfügt über eine Synchronisierungsmethode, die sicherstellt das eine Anzahl von n Threads diese Methode aufrufen müssen bevor diese fortfahren können.
Testen Sie Ihre Überwachung der Implementierung innerhalb eines ausführlichen Java-Programms mit unterschiedlichen Werten für n.
Bitte geben Sie bei jeder Statusänderung des Monitors eine Meldung auf der Konsole aus.
Bedeutet das, dass ich eine Schranke (Monitor) benötige, der Threads empfängt n-Stück. Sobald er diese zusammen gesammelt hat dürfen die Threads wieder weiter laufen?

Also eine Klasse, nenn ich sie mal Threads erzeugt 20 Threads. Diese zahl 20 muss die Schranke wissen. Die Schranke sammelt die Threads ein, wartet bis alle da sind. Sobald alle 20 Threads in der Schranke sind, gibt die Schranke die Threads wieder frei und diese laufen dann einfach wieder weiter. Wäre das so richtig oder wie kann man das noch verstehen?

Bin dankbar für jede Hilfe :)
 

KonradN

Super-Moderator
Mitarbeiter
Also die Aufgabe würde ich jetzt auch so verstehen. Aber der Begriff Monitor passt da aus meiner Sicht nicht richtig. Da habe ich eine etwas andere Vorstellung - wie sie z.B. in https://de.wikipedia.org/wiki/Monitor_(Informatik) beschrieben wurde.

Aber da kann evtl. jemand anderes deutlich mehr zu sagen - mein Studium ist deutlich zu lange her und in dem fachlichen Bereich habe ich so eigentlich nichts zu tun gehabt all die Jahre ...
 

BodyLAB

Bekanntes Mitglied
Danke @KonradN. Dann hätte ich nun ein altbekanntes Problem erneut :-( So vermute ich mal.

Hier mal mein Anfang. Ist natürlich Quatsch :D
Java:
public class Schranke {
    private int n, i = 0;
   
    public Schranke(int n) {
        this.n = n;
    }
   
    public synchronized void warten() {
        try {  
        while(i < n) {
            System.out.println("Der " + i++ + " Thread wartet in der Schranke.");
            wait();
        }  
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        System.out.println("Die Threads laufen weiter!");
        notifyAll();
    }
   
}

Das notifyAll() würde ja nie erreicht werden etc. deswegen ist das natürlich Quatsch.
Also hab ich hier erneut das Problem wenn die Variable erreicht wird und n Threads vorhanden sind müsste die Schranke erkennen: "Hey ich sollte jetzt alle Threads wieder wecken". Funktioniert so etwas? Falls NEIN ist mein Ansatz schon Falsch.
Anders hätte ich gerade keine Idee an solch eine Sache ran zu gehen.

Mir ist gerade noch so etwas eingefallen.
Java:
    public synchronized void warten() {
        try {   
        while(i < n) {
            System.out.println("Der " + i++ + " Thread wartet in der Schranke.");
            if(i == n -1)
                notifyAll();
            wait();
        }   
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("Die Threads laufen weiter!");
        notify();
    }

Weiß nur nicht ob es wirklich so läuft wie es laufen soll :D Außerdem haben wir gelernt das wait() und notify() pärchenweise auftreten sollen. Hier hätte ich aber nur ein wait und zweimal notify sogar notifyAll und notify :D
 

KonradN

Super-Moderator
Mitarbeiter
Du brauchst in dem Monitor keine While Schleife. Dort betrachtest Du ja den Weg, den ein Thread geht. Die Schleife brauchst Du nur bei der Methode für den Test, denn da sollst Du ja n Threads erzeugen.

Was soll denn ein Thread machen, wenn er da rein kommt?
- Als erstes wollen wir diesen zählen.
- Dann kann es sein, dass die Anzahl der Threads noch zu gering ist. Was macht er dann? (Hast Du prinzipiell schon)
- Wenn es der n-te Thread ist: Was machen wir dann? Zwei Dinge sind zu machen. Eine Sache hast Du vom Prinzip an falscher Stelle schon, aber eine zweite Sache fehlt noch. Hierzu ggf. einfach mal durchspielen, was passiert, wenn der (n+1)-te Thread kommt.
 

KonradN

Super-Moderator
Mitarbeiter
Und ein Thema hatten wir letzte Mal etwas diskutiert (Du erinnerst Dich evtl., noch - ist ganz leicht eskaliert): Wenn mehrere Threads auf eine Variable zugreifen, dann macht es prinzipiell Sinn, diese Variable leicht anzupassen (Auch wenn es für eine Nutzung rein in synchronized Methoden vermutlich nicht notwendig ist).
Aber ich würde klar dazu raten, die Anpassung vorzunehmen.
 

BodyLAB

Bekanntes Mitglied
diese Variable leicht anzupassen
Das weiß ich leider gerade nicht mehr :(

Hab es nun so gemacht. Eine Klasse Threads, die erstellt N Threads, diese laufen dann in die Schranke und müssen dort erstmal warten bevor es weiter geht.
Java:
public class Threads extends Thread {
    private Schranke s;

    public Threads(Schranke s, String name) {
        super(name);
        this.s = s;
    }

    public void run() {
        s.warten();
    }

    public static void main(String[] args) {
        int n = 10;
        Schranke s = new Schranke(n);
        for (int i = 0; i < n; i++)
            new Threads(s, "Nr. " + i).start();
        ;
    }

}
Java:
public class Schranke {
    private int n, count = 0;

    public Schranke(int n) {
        this.n = n;
    }

    public synchronized void warten() {
        try {
            count++;
            System.out.println("Es wartet derzeit " + count + " Thread in der Schranke.");
            Thread.sleep(500);
            if (count == n)
                notifyAll();
            else
                wait();
            System.out.println("Der " + count-- + " Thread laueft wieder weiter.");
        } catch (InterruptedException e) {
            System.out.println(e.getStackTrace());
        }
    }

}

Was ich leider nicht verstehe ist, wenn ich einem Thread einen Namen übergebe, wie könnte ich diesen Namen abgreifen? Glaube es geht sicherlich dann nur so, dass man jeden Thread an die Schranke übergibt. Diese dann in einer Datenstruktur verwahrt und könnte dann z. B. Threads[] t; t[0].getName(); aufrufen.

Die Schleife benötigt man nicht das stimmt wohl :)
 

KonradN

Super-Moderator
Mitarbeiter

BodyLAB

Bekanntes Mitglied
Was passiert, wenn Du eine Schranke von 10 hast aber 100 (= 10 * n) Threads erstellst?
Autsch. Daran hätte ich nicht gedacht. Misst!!!

Wenn ich mehr als N Threads habe, wird irgendwann ein Thread frei somit kann der nächste Thread in die Schranke laufen etc. die Abfrage if (count == n) wird nicht mehr erfüllt und alle warten ewig. :eek:
 

KonradN

Super-Moderator
Mitarbeiter
Wie viele Threads sind denn "im Monitor", nachdem der n-te Thread drinnen war? Wenn Du das sagen kannst, dann könntest Du den Zähler ja entsprechend umsetzen.
 

KonradN

Super-Moderator
Mitarbeiter
Oder evtl. ist es einfacher, denn Du Dir überlegst:
Beim Eintritt / am Anfang zählst Du den Zähler hoch ... da könnte man dann ja am Ende / vor dem Verlassen evtl. irgend etwas anderes machen ....
 

BodyLAB

Bekanntes Mitglied
Mein Problem ist das ich nicht weiß wie die Threads weiter machen, die in der Schranke sind.
Hab auch versucht den count = 0 zu setzen wenn ich notifyAll() aufrufe. Das geht aber auch nicht :D
Wie viele Threads sind denn "im Monitor", nachdem der n-te Thread drinnen war? Wenn Du das sagen kannst, dann könntest Du den Zähler ja entsprechend umsetzen.
Nach dem der n-te Thread drin ist, sind 10 Stück drin. Dann ruft dieser notifyAll auf und setzt den count-- eins runter. Somit sollten dann noch 9 Stück drin sein oder ist das auch schon falsch? Da ist ja mein Problem, dass dann ja einer der vielen anderen Threads zum zuge kommt und dann eben später nichts mehr geht :D
 

BodyLAB

Bekanntes Mitglied
Kann man das Problem irgendwie so lösen, dass wir die Schranke erst füllen und dann wieder leeren. Das ganze macht man dann so lange bis keine Threads mehr über sind. Die anderen Threads die zu viel sind müssen eben eh immer Schlafen, bis die Schranke leer ist. Dann bräuchte ich noch einen Zähler der sagt wie viele Threads in der Schranke gerade sind.
 

KonradN

Super-Moderator
Mitarbeiter
Hab auch versucht den count = 0 zu setzen wenn ich notifyAll() aufrufe. Das geht aber auch nicht :D
Wie sah das im Code denn aus? Denn genau das sollte es eigentlich sein.

Die andere Möglichkeit wäre, dass jeder Thread beim verlassen immer count um eins reduziert. Aber da kann es Nebeneffekte geben, denn die schlafenden Threads müssen nach dem wait ja erst mal weiter machen. Ggf. kommt aber noch ein Thread rein und dann wäre count == n womöglich schon wieder wahr. Daher ist die Idee, count auf 0 zu setzen, im Augenblick die richtige Lösung.
 

BodyLAB

Bekanntes Mitglied
Java:
public class Schranke {
    private int n, count = 0;

    public Schranke(int n) {
        this.n = n;
    }

    public synchronized void warten() {
        try {
            count++;
            System.out.println("Es wartet derzeit " + count + " Thread in der Schranke.");
            //Thread.sleep(50);
            if (count == n) {
                count = 0;
                notifyAll();
            }
            else
                wait();
            System.out.println("Der " + count-- + " Thread laueft wieder weiter.");
        } catch (InterruptedException e) {
            System.out.println(e.getStackTrace());
        }
    }

}

Ich hab nur in der If Bedingung den count = 0 gesetzt.
Die Ausgabe zeigen auch das es so nicht geht, denn wir kommen in den negativen bereich wodurch wir erneut Blockiert werden könnten.
Hab ich count = 0 an der Falschen stelle?
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe Dir zwei Ideen genannt, von der Du entweder die eine oder die andere umsetzen sollst. Aber nicht beide gleichzeitig!
Wenn Du count auf 0 setzt, dann darfst Du es nicht mehr reduzieren.
 

BodyLAB

Bekanntes Mitglied
Ich habe Dir zwei Ideen genannt, von der Du entweder die eine oder die andere umsetzen sollst. Aber nicht beide gleichzeitig!
Wenn Du count auf 0 setzt, dann darfst Du es nicht mehr reduzieren.
So geht es :)
Darf ich noch fragen wieso es zu einem Deadlock kommt wenn ich beides mache? :D

Java:
    public synchronized void warten() {
        try {
            count++;
            
            System.out.println("Es wartet derzeit " + count + " Thread in der Schranke.");
            //Thread.sleep(50);
            if (count == n) {
                count = 0;
                notifyAll();
            }
            else
                wait();
            System.out.println("Der " + ++i + " Thread laueft wieder weiter.");
                        
        } catch (InterruptedException e) {
            System.out.println(e.getStackTrace());
        }
    }

Ich versuch das ganze morgen mal noch mit einer while Schleife, das sollte doch auch gehen oder?
Danke nochmals :)
 

KonradN

Super-Moderator
Mitarbeiter
Es kommt zu keinem Deadlock, nur eben brauchst Du für den zweiten Durchgang dann 20 Threads, für den 3ten Thread dann 30 ... dann 40 ...

Das wäre zumindest mein Verständnis.
 

BodyLAB

Bekanntes Mitglied
Okay. Für mich sieht die Sache jetzt auch Logisch aus :)
____
Wird heute auch noch so Programmiert oder gibt es dafür nicht Objekte die das ganze Kapseln? Auch wenn dann die Parallelität etwas eingeschränkt werden sollte das kann man doch an sich in Kauf nehmen oder?
Ist diese Queue so ein Objekt vielleicht 🙃
 

KonradN

Super-Moderator
Mitarbeiter
Wird heute auch noch so Programmiert oder gibt es dafür nicht Objekte die das ganze Kapseln? Auch wenn dann die Parallelität etwas eingeschränkt werden sollte das kann man doch an sich in Kauf nehmen oder?
Also meiner Meinung nach sind das Grundlagen, die Du einmal lernen sollst und die Du vermutlich später nie mehr selbst programmieren wirst.
Aber das Wichtige ist das Verständnis. Und dazu ist auch das Doing wichtig, weil so prägt sich das deutlich besser ein.

Generell gibt es viele Klassen, die hier Dinge bieten, aber die Frage ist wirklich, was Du entwickelst. Gerade in Java hast Du in den meisten Anwendungsgebieten damit nicht viel am Hut.
 

BodyLAB

Bekanntes Mitglied
Also meiner Meinung nach sind das Grundlagen, die Du einmal lernen sollst und die Du vermutlich später nie mehr selbst programmieren wirst.
Aber das Wichtige ist das Verständnis. Und dazu ist auch das Doing wichtig, weil so prägt sich das deutlich besser ein.
Also wie immer finde ich beim Programmieren. Es geht nur mit Doing und fleiß :)

Generell gibt es viele Klassen, die hier Dinge bieten, aber die Frage ist wirklich, was Du entwickelst. Gerade in Java hast Du in den meisten Anwendungsgebieten damit nicht viel am Hut.
Das hört man an sich auch ganz gerne ;-)
 

BodyLAB

Bekanntes Mitglied
Liest hier noch jemand weiter? Ich hätte noch eine Aufgabe und wieder ein MEGA Problem 😔

Aufgabe:
Ein Museum ermöglicht Besuchern den Eingang durch den Osteingang und den Ausgang durch den Westausgang.
An- und Abreise werden dem Museumsleiter über das Drehkreuze am Ein- und Ausgang signalisiert.
Wenn das Museum geöffnet ist, signalisiert der Museumsdirektor dem Controller, dass das Museum geöffnet ist, und
der Controller öffnet dann die Ankünfte und Abreisen.
Zum Zeitpunkt der Schließung signalisiert der Direktor, dass das Museum geschlossen ist.
Jetzt lässt der Lotse nur noch Abfahrten zu.
Öffnung um 9:00 Uhr und Schließung um 16:00 Uhr.
Aufgrund der aktuellen Pandemie-Situation achten Sie darauf, dass nur 50 Besucher gleichzeitig das Museum betreten dürfen.

Ich hätte bei der Aufgabe 5 Klassen (am Anfang eher 6), einen Eingang, Ausgang, Leiter, Controller, Besucher (Anfangs: Museum).
Der Eingang und Ausgang sind Monitore, Besucher und Leiter sollten Threads sein.
Nun dachte ich Anfangs an Museum weil ich nicht weiß wie ich die maximale Anzahl der Besucher sonst organisieren kann. Nun hätte ich alles in den Controller gepackt. Doch da hätte ich das selbe Problem wie mit der Museums Klasse. Wie bekomme ich in der Eingangs- und Ausgangs Klasse die maximale Anzahl verteilt. Sprich wenn der Controller ein int max = 50 hat, sollte der Eingang ja erkennen ab 50 lasse ich niemand mehr rein, nach einer gewissen Zeit sollte jemand aus dem Museum raus gehen. Dann muss der Controller max -1 machen etc.

Kann mir das jemand vielleicht erklären oder ist meine ganze Annahme komplett falsch!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JFrame / Screen auf zweitem (definiertem) Monitor öffnen Java Basics - Anfänger-Themen 3
temi Synchronized(Monitor) Java Basics - Anfänger-Themen 2
R Monitor Refresh-Rate Java Basics - Anfänger-Themen 8
I Print Monitor Java Basics - Anfänger-Themen 0
Luk10 Monitor: wait() und notify() Java Basics - Anfänger-Themen 8
J auf ausgabe am monitor reagieren Java Basics - Anfänger-Themen 16
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben