Udfordring: Blockingqueue
Opgave
Du skal implementere nogle BlockingQueue-metoder for bedre at forstå, hvordan denne samling fungerer, og for at styrke din forståelse af materialet!
Du skal gå til BlockingQueueueImpl, hvor der i selve klassen vil være 2 ikke-implementerede metoder, som du selv skal implementere. Du behøver ikke at finde på en kompliceret løsning, du skal blot gentage funktionaliteten af en almindelig BlockingQueueue.
Du har også en Main-klasse, hvor du skal teste din BlockingQueueueImpl for at sikre, at den fungerer korrekt.
Du kan kontrollere dette ved at tilføje mere end 10 elementer til queue (eller mere end den limit, du har initialiseret i konstruktøren), og det næste element skal vente, indtil der er færre elementer i køen end grænsen, og først derefter kan det næste element tilføjes.
put() - synkroniseret metode der tilføjer elementer til køen, hvis køgrænsen ikke er overskredet; hvis den er, pauser den køen
take() - synkroniseret metode der tager et element fra køen, returnerer det og fjerner det; hvis køen er tom, pauser den køen
Løsningsforslag
For at implementere put() skal du kontrollere om køen er fuld, dvs. om den ikke er lig med grænsen, og hvis den er, sætte tråden på pause. Hvis den ikke er fuld, skal du kontrollere om køen er tom (isEmpty()), og hvis tråden er tom, kalde metoden der frigiver alle tråde (notifyAll()). Til sidst tilføjes elementet til queue.
For at implementere take() skal du kontrollere om køen er tom; hvis den er tom, sættes tråden på pause (fordi der ikke er noget at læse). Hvis køen ikke er tom, skal du foretage endnu en kontrol for om listen er komplet, og hvis listen har samme størrelse som limit, så frigiv alle tråde og returnér det første element i køen (det, der blev tilføjet før de andre).
Metoder, du skal bruge for at udføre opgaven
wait()- sætter tråden på pause;notifyAll()- vækker alle tråde, der er sat på pause;queue.isEmpty()- Tjekker om køen er tom (true - køen er tom).
Når du har implementeret disse metoder og testet i Main-klassen, gå til /src/test/java/BlockingQueueueImplTest.java og kør alle tests.
Hvis de gennemføres uden fejl, tillykke, så har du gjort det rigtigt! Hvis ikke, har du enten en forkert løsning eller du har ændret noget, der ikke skulle ændres.
Prøv også selv at løse opgaven, men hvis det ikke lykkes, og du gerne vil kende svaret, er der et link til løsningen. Kopiér dog ikke bare koden, men forsøg at forstå den!
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Can you explain how the put() and take() methods should handle thread synchronization?
What should I do if my implementation causes deadlocks or threads to hang?
Can you give an example of how to test the BlockingQueueImpl in the Main class?
Awesome!
Completion rate improved to 3.33
Udfordring: Blockingqueue
Stryg for at vise menuen
Opgave
Du skal implementere nogle BlockingQueue-metoder for bedre at forstå, hvordan denne samling fungerer, og for at styrke din forståelse af materialet!
Du skal gå til BlockingQueueueImpl, hvor der i selve klassen vil være 2 ikke-implementerede metoder, som du selv skal implementere. Du behøver ikke at finde på en kompliceret løsning, du skal blot gentage funktionaliteten af en almindelig BlockingQueueue.
Du har også en Main-klasse, hvor du skal teste din BlockingQueueueImpl for at sikre, at den fungerer korrekt.
Du kan kontrollere dette ved at tilføje mere end 10 elementer til queue (eller mere end den limit, du har initialiseret i konstruktøren), og det næste element skal vente, indtil der er færre elementer i køen end grænsen, og først derefter kan det næste element tilføjes.
put() - synkroniseret metode der tilføjer elementer til køen, hvis køgrænsen ikke er overskredet; hvis den er, pauser den køen
take() - synkroniseret metode der tager et element fra køen, returnerer det og fjerner det; hvis køen er tom, pauser den køen
Løsningsforslag
For at implementere put() skal du kontrollere om køen er fuld, dvs. om den ikke er lig med grænsen, og hvis den er, sætte tråden på pause. Hvis den ikke er fuld, skal du kontrollere om køen er tom (isEmpty()), og hvis tråden er tom, kalde metoden der frigiver alle tråde (notifyAll()). Til sidst tilføjes elementet til queue.
For at implementere take() skal du kontrollere om køen er tom; hvis den er tom, sættes tråden på pause (fordi der ikke er noget at læse). Hvis køen ikke er tom, skal du foretage endnu en kontrol for om listen er komplet, og hvis listen har samme størrelse som limit, så frigiv alle tråde og returnér det første element i køen (det, der blev tilføjet før de andre).
Metoder, du skal bruge for at udføre opgaven
wait()- sætter tråden på pause;notifyAll()- vækker alle tråde, der er sat på pause;queue.isEmpty()- Tjekker om køen er tom (true - køen er tom).
Når du har implementeret disse metoder og testet i Main-klassen, gå til /src/test/java/BlockingQueueueImplTest.java og kør alle tests.
Hvis de gennemføres uden fejl, tillykke, så har du gjort det rigtigt! Hvis ikke, har du enten en forkert løsning eller du har ændret noget, der ikke skulle ændres.
Prøv også selv at løse opgaven, men hvis det ikke lykkes, og du gerne vil kende svaret, er der et link til løsningen. Kopiér dog ikke bare koden, men forsøg at forstå den!
Tak for dine kommentarer!