Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Utmaning: Blockingqueue | Synkroniserade Samlingar
Multitrådning i Java

bookUtmaning: Blockingqueue

Uppgift

Du behöver implementera vissa metoder för BlockingQueue för att få en bättre förståelse för hur samlingen fungerar och för att fördjupa dina kunskaper i ämnet!

Du behöver gå till BlockingQueueueImpl, där det finns 2 oimplementerade metoder som du själv ska implementera. Du behöver inte hitta på någon komplicerad lösning, utan bara återskapa funktionaliteten hos en vanlig BlockingQueueue.

Note
Notering

Du har även en Main-klass där du ska testa din BlockingQueueueImpl för att säkerställa att den fungerar korrekt.

Detta kan kontrolleras genom att lägga till fler än 10 objekt i queue (eller fler än det limit som du initierade i konstruktorn) och nästa objekt måste vänta tills det finns färre objekt i kön än gränsen och först då kan nästa objekt läggas till.

put() - synkroniserad metod som lägger till objekt i kön om kögränsen inte överskrids, om den gör det pausas kön

take()- synkroniserad metod som tar ett objekt från kön, returnerar det och tar bort det, om kön är tom pausas den

Lösningstips

För att implementera put() bör du kontrollera om kön är full, det vill säga om den inte är lika med limit och om den är det, pausa tråden. Om den inte är full, bör du kontrollera om kön är tom (isEmpty()) och om tråden är tom anropa metoden som frigör alla trådar (notifyAll()). Lägg sedan till objektet i queue.

För att implementera take() behöver du kontrollera om kön är tom, om den är tom pausar du tråden (eftersom det inte finns något att läsa), om kön inte är tom gör du en ytterligare kontroll av listans fullständighet och om listans storlek är lika med limit, frigör då alla trådar och returnera det första objektet i kön (det som lades till tidigare än de andra).

Metoder du behöver använda

  • wait() – pausar tråden;
  • notifyAll() – väcker alla trådar som är pausade;
  • queue.isEmpty() – Kontrollerar om kön är tom (true – kön är tom).

Efter att ha använt dessa metoder och testat i Main-klassen, gå till /src/test/java/BlockingQueueueImplTest.java och kör alla tester.

Om de körs utan fel, grattis – då har du gjort allt rätt! Om inte, har du antingen en felaktig lösning eller så har du ändrat något som inte borde ha ändrats.

Note
Notering

Försök även att lösa uppgiften själv, men om du inte lyckas och vill veta svaret finns det en länk till lösningen. Kopiera inte bara koden, utan försök att förstå den!

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 3.33

bookUtmaning: Blockingqueue

Svep för att visa menyn

Uppgift

Du behöver implementera vissa metoder för BlockingQueue för att få en bättre förståelse för hur samlingen fungerar och för att fördjupa dina kunskaper i ämnet!

Du behöver gå till BlockingQueueueImpl, där det finns 2 oimplementerade metoder som du själv ska implementera. Du behöver inte hitta på någon komplicerad lösning, utan bara återskapa funktionaliteten hos en vanlig BlockingQueueue.

Note
Notering

Du har även en Main-klass där du ska testa din BlockingQueueueImpl för att säkerställa att den fungerar korrekt.

Detta kan kontrolleras genom att lägga till fler än 10 objekt i queue (eller fler än det limit som du initierade i konstruktorn) och nästa objekt måste vänta tills det finns färre objekt i kön än gränsen och först då kan nästa objekt läggas till.

put() - synkroniserad metod som lägger till objekt i kön om kögränsen inte överskrids, om den gör det pausas kön

take()- synkroniserad metod som tar ett objekt från kön, returnerar det och tar bort det, om kön är tom pausas den

Lösningstips

För att implementera put() bör du kontrollera om kön är full, det vill säga om den inte är lika med limit och om den är det, pausa tråden. Om den inte är full, bör du kontrollera om kön är tom (isEmpty()) och om tråden är tom anropa metoden som frigör alla trådar (notifyAll()). Lägg sedan till objektet i queue.

För att implementera take() behöver du kontrollera om kön är tom, om den är tom pausar du tråden (eftersom det inte finns något att läsa), om kön inte är tom gör du en ytterligare kontroll av listans fullständighet och om listans storlek är lika med limit, frigör då alla trådar och returnera det första objektet i kön (det som lades till tidigare än de andra).

Metoder du behöver använda

  • wait() – pausar tråden;
  • notifyAll() – väcker alla trådar som är pausade;
  • queue.isEmpty() – Kontrollerar om kön är tom (true – kön är tom).

Efter att ha använt dessa metoder och testat i Main-klassen, gå till /src/test/java/BlockingQueueueImplTest.java och kör alla tester.

Om de körs utan fel, grattis – då har du gjort allt rätt! Om inte, har du antingen en felaktig lösning eller så har du ändrat något som inte borde ha ändrats.

Note
Notering

Försök även att lösa uppgiften själv, men om du inte lyckas och vill veta svaret finns det en länk till lösningen. Kopiera inte bara koden, utan försök att förstå den!

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 4
some-alt