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

bookHerausforderung: Blockingqueue

Aufgabe

Es sollen einige Methoden der BlockingQueue implementiert werden, um das Funktionsprinzip dieser Collection besser zu verstehen und das Material zu vertiefen.

Erforderlich ist, zur Klasse BlockingQueueueImpl zu wechseln. In dieser Klasse befinden sich 2 nicht implementierte Methoden, die eigenständig zu realisieren sind. Es ist nicht notwendig, eine komplexe Lösung zu entwickeln; es genügt, die Funktionalität einer gewöhnlichen BlockingQueueue nachzubilden.

Note
Hinweis

Es steht außerdem eine Main-Klasse zur Verfügung, in der die eigene Implementierung von BlockingQueueueImpl getestet werden kann, um die korrekte Funktionsweise sicherzustellen.

Dies kann überprüft werden, indem mehr als 10 Elemente zur queue hinzugefügt werden (oder mehr als das im Konstruktor initialisierte limit). Das nächste Element muss dann warten, bis sich weniger Elemente als das Limit in der Queue befinden, und erst dann kann das nächste Element eingefügt werden.

put()synchronisierte Methode, die Elemente zur Queue hinzufügt, sofern das Queue-Limit nicht überschritten wird. Ist das Limit erreicht, wird die Queue pausiert.

take()synchronisierte Methode, die ein Element aus der Queue entnimmt, es zurückgibt und entfernt. Ist die Queue leer, wird sie pausiert.

Lösungshinweis

Zur Implementierung von put() sollte geprüft werden, ob die Queue voll ist, d.h. ob sie dem Limit entspricht. Falls ja, wird der Thread pausiert. Ist sie nicht voll, sollte die Queue auf Leerheit geprüft werden (isEmpty()) und falls sie leer ist, die Methode zum Freigeben aller Threads (notifyAll()) aufgerufen werden. Anschließend wird das Element zur queue hinzugefügt.

Zur Implementierung von take() muss geprüft werden, ob die Queue leer ist. Ist sie leer, wird der Thread pausiert (da nichts zum Lesen vorhanden ist). Ist die Queue nicht leer, erfolgt eine weitere Prüfung auf die Vollständigkeit der Liste. Wenn die Listengröße dem limit entspricht, werden alle Threads freigegeben und das erste Element in der Queue zurückgegeben (dasjenige, das später als die anderen hinzugefügt wurde).

Methoden, die benötigt werden

  • wait() – pausiert den Thread;
  • notifyAll() – weckt alle pausierten Threads auf;
  • queue.isEmpty() – prüft, ob die Warteschlange leer ist (true – Warteschlange ist leer).

Nachdem diese Methoden implementiert und in der Main-Klasse getestet wurden, zu /src/test/java/BlockingQueueueImplTest.java wechseln und alle Tests ausführen.

Wenn sie erfolgreich durchlaufen, herzlichen Glückwunsch, alles richtig gemacht! Andernfalls liegt entweder eine falsche Lösung vor oder es wurde etwas geändert, das nicht geändert werden sollte.

Note
Hinweis

Versuche das Problem auch selbst zu lösen. Falls es nicht gelingt und du die Antwort wissen möchtest, gibt es einen Link zur Lösung. Kopiere den Code jedoch nicht einfach, sondern versuche, ihn zu verstehen!

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Awesome!

Completion rate improved to 3.33

bookHerausforderung: Blockingqueue

Swipe um das Menü anzuzeigen

Aufgabe

Es sollen einige Methoden der BlockingQueue implementiert werden, um das Funktionsprinzip dieser Collection besser zu verstehen und das Material zu vertiefen.

Erforderlich ist, zur Klasse BlockingQueueueImpl zu wechseln. In dieser Klasse befinden sich 2 nicht implementierte Methoden, die eigenständig zu realisieren sind. Es ist nicht notwendig, eine komplexe Lösung zu entwickeln; es genügt, die Funktionalität einer gewöhnlichen BlockingQueueue nachzubilden.

Note
Hinweis

Es steht außerdem eine Main-Klasse zur Verfügung, in der die eigene Implementierung von BlockingQueueueImpl getestet werden kann, um die korrekte Funktionsweise sicherzustellen.

Dies kann überprüft werden, indem mehr als 10 Elemente zur queue hinzugefügt werden (oder mehr als das im Konstruktor initialisierte limit). Das nächste Element muss dann warten, bis sich weniger Elemente als das Limit in der Queue befinden, und erst dann kann das nächste Element eingefügt werden.

put()synchronisierte Methode, die Elemente zur Queue hinzufügt, sofern das Queue-Limit nicht überschritten wird. Ist das Limit erreicht, wird die Queue pausiert.

take()synchronisierte Methode, die ein Element aus der Queue entnimmt, es zurückgibt und entfernt. Ist die Queue leer, wird sie pausiert.

Lösungshinweis

Zur Implementierung von put() sollte geprüft werden, ob die Queue voll ist, d.h. ob sie dem Limit entspricht. Falls ja, wird der Thread pausiert. Ist sie nicht voll, sollte die Queue auf Leerheit geprüft werden (isEmpty()) und falls sie leer ist, die Methode zum Freigeben aller Threads (notifyAll()) aufgerufen werden. Anschließend wird das Element zur queue hinzugefügt.

Zur Implementierung von take() muss geprüft werden, ob die Queue leer ist. Ist sie leer, wird der Thread pausiert (da nichts zum Lesen vorhanden ist). Ist die Queue nicht leer, erfolgt eine weitere Prüfung auf die Vollständigkeit der Liste. Wenn die Listengröße dem limit entspricht, werden alle Threads freigegeben und das erste Element in der Queue zurückgegeben (dasjenige, das später als die anderen hinzugefügt wurde).

Methoden, die benötigt werden

  • wait() – pausiert den Thread;
  • notifyAll() – weckt alle pausierten Threads auf;
  • queue.isEmpty() – prüft, ob die Warteschlange leer ist (true – Warteschlange ist leer).

Nachdem diese Methoden implementiert und in der Main-Klasse getestet wurden, zu /src/test/java/BlockingQueueueImplTest.java wechseln und alle Tests ausführen.

Wenn sie erfolgreich durchlaufen, herzlichen Glückwunsch, alles richtig gemacht! Andernfalls liegt entweder eine falsche Lösung vor oder es wurde etwas geändert, das nicht geändert werden sollte.

Note
Hinweis

Versuche das Problem auch selbst zu lösen. Falls es nicht gelingt und du die Antwort wissen möchtest, gibt es einen Link zur Lösung. Kopiere den Code jedoch nicht einfach, sondern versuche, ihn zu verstehen!

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4
some-alt