Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Udfordring: Blockingqueue | Synchroniserede Samlinger
Multitrådning i Java

bookUdfordring: 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.

Note
Bemærk

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.

Note
Bemærk

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!

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

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

bookUdfordring: 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.

Note
Bemærk

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.

Note
Bemærk

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!

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 4
some-alt