Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Herausforderung BlockingQueue | Synchronisierte Sammlungen
Multithreading in Java
course content

Kursinhalt

Multithreading in Java

Multithreading in Java

1. Grundlagen der Multithread-Verarbeitung
2. Synchronisierte Sammlungen
3. Hochrangige Synchronisationsmechanismen
4. Best Practices für Multithreading

book
Herausforderung BlockingQueue

Aufgabe

Sie müssen nur einige BlockingQueue-Methoden implementieren, um besser zu verstehen, wie die Sammlung selbst funktioniert, und um das Material besser zu lernen!

Sie müssen zu BlockingQueueueImpl gehen, in der Klasse selbst wird es 2 nicht realisierte Methoden geben, die Sie selbst implementieren müssen. Sie müssen sich keine komplizierte Lösung ausdenken, Sie müssen nur die Funktionalität einer regulären BlockingQueueue wiederholen.

Hinweis

Sie haben auch eine Main-Klasse, in der Sie Ihre BlockingQueueueImpl testen müssen, um sicherzustellen, dass sie korrekt funktioniert.

Sie können dies überprüfen, indem Sie mehr als 10 Elemente zur queue hinzufügen (oder mehr als das limit, das Sie im Konstruktor initialisiert haben), und das nächste Element muss warten, bis weniger Elemente in der Warteschlange sind als das Limit, und erst dann das nächste Element schreiben.

put() - synchronisierte Methode, die Elemente zur Warteschlange hinzufügt, wenn das Warteschlangenlimit nicht überschritten wird, wenn es überschritten wird, pausiert sie die Warteschlange

take()- synchronisierte Methode, die ein Element aus der Warteschlange nimmt, es zurückgibt und entfernt, wenn die Warteschlange leer ist, pausiert sie

Lösungstipp

Um put() zu implementieren, sollten Sie überprüfen, ob die Warteschlange voll ist, d.h. ob sie nicht gleich dem Limit ist und wenn ja, den Thread pausieren. Wenn sie nicht voll ist, sollten Sie die Warteschlange auf Leere überprüfen (isEmpty()) und wenn der Thread leer ist, die Methode aufrufen, die alle Threads freigibt (notifyAll()). Dann fügen Sie das Element zur queue hinzu.

Um take() zu implementieren, müssen Sie überprüfen, ob die Warteschlange leer ist, wenn sie leer ist, pausieren Sie den Thread (weil es nichts zu lesen gibt), wenn die Warteschlange nicht leer ist, machen Sie eine weitere Überprüfung auf die Vollständigkeit der Liste und wenn die Listengröße gleich dem limit ist, dann geben Sie alle Threads frei und geben das erste Element in der Warteschlange zurück (dasjenige, das später als die anderen hinzugefügt wurde).

Methoden, die Sie ausführen müssen

  • wait() - pausiert den Thread;
  • notifyAll()- weckt alle pausierten Threads auf;
  • queue.isEmpty() - Überprüft die Warteschlange auf Leerheit (true - Warteschlange ist leer).

Nachdem Sie diese Methoden ausgeführt und in der Main-Klasse getestet haben, gehen Sie zu /src/test/java/BlockingQueueueImplTest.java und führen Sie alle Tests aus.

Wenn sie erfolgreich ausgeführt werden, herzlichen Glückwunsch, Sie haben alles richtig gemacht! Wenn nicht, haben Sie entweder die falsche Lösung oder Sie haben etwas geändert, das nicht hätte geändert werden sollen.

Hinweis

Versuchen Sie auch, das Problem selbst zu lösen, aber wenn Sie nicht erfolgreich sind und die Antwort wissen möchten, gibt es einen Link zur Lösung. Kopieren Sie den Code nicht einfach, sondern versuchen Sie, ihn zu verstehen!

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4
We're sorry to hear that something went wrong. What happened?
some-alt