Kursinhalt
Multithreading in Java
Multithreading in Java
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 IhreBlockingQueueueImpl
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!
Danke für Ihr Feedback!