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

bookUtfordring: Blockingqueue

Oppgave

Du skal implementere noen BlockingQueue-metoder for å få bedre forståelse av hvordan samlingen fungerer og for å styrke læringen av materialet!

Du må gå til BlockingQueueueImpl, hvor det finnes 2 uimplementerte metoder som du skal implementere selv. Du trenger ikke å finne på en komplisert løsning, det holder å gjenskape funksjonaliteten til en vanlig BlockingQueueue.

Note
Merk

Du har også en Main-klasse hvor du skal teste din BlockingQueueueImpl for å sikre at den fungerer korrekt.

Du kan kontrollere dette ved å legge til mer enn 10 elementer i queue (eller flere enn limit du initialiserte i konstruktøren), og det neste elementet må vente til det er færre elementer i køen enn grensen, og først da kan det neste elementet legges til.

put()synkronisert metode som legger til elementer i køen hvis køgrensen ikke er overskredet, hvis den er det, pauser den køen

take()synkronisert metode som tar ut et element fra køen, returnerer det og fjerner det, hvis køen er tom, pauser den

Løsningshint

For å implementere put() bør du sjekke om køen er full, altså om den ikke er lik grensen, og hvis den er det, pause tråden. Hvis den ikke er full, bør du sjekke om køen er tom (isEmpty()) og hvis tråden er tom, kalle metoden som frigjør alle tråder (notifyAll()). Deretter legger du til elementet i queue.

For å implementere take() må du sjekke om køen er tom, hvis den er tom pauser du tråden (fordi det ikke er noe å lese), hvis køen ikke er tom gjør du en ny sjekk for om listen er komplett og hvis listen har størrelse lik limit, frigjør du alle tråder og returnerer første element i køen (det som ble lagt til sist av de andre).

Metoder du vil trenge å bruke

  • wait() - setter tråden på pause;
  • notifyAll()- vekker alle tråder som er satt på pause;
  • queue.isEmpty() - Sjekker om køen er tom (true - køen er tom).

Etter å ha brukt disse metodene og testet i Main-klassen, gå til /src/test/java/BlockingQueueueImplTest.java og kjør alle testene.

Hvis de kjøres uten feil, gratulerer, da har du gjort alt riktig! Hvis ikke, har du enten en feil løsning eller du har endret noe som ikke skulle vært endret.

Note
Merk

Prøv også å løse oppgaven selv, men hvis du ikke får det til og ønsker å se fasiten, finnes det en lenke til løsningen. Ikke bare kopier koden, men forsøk å forstå den!

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 3.33

bookUtfordring: Blockingqueue

Sveip for å vise menyen

Oppgave

Du skal implementere noen BlockingQueue-metoder for å få bedre forståelse av hvordan samlingen fungerer og for å styrke læringen av materialet!

Du må gå til BlockingQueueueImpl, hvor det finnes 2 uimplementerte metoder som du skal implementere selv. Du trenger ikke å finne på en komplisert løsning, det holder å gjenskape funksjonaliteten til en vanlig BlockingQueueue.

Note
Merk

Du har også en Main-klasse hvor du skal teste din BlockingQueueueImpl for å sikre at den fungerer korrekt.

Du kan kontrollere dette ved å legge til mer enn 10 elementer i queue (eller flere enn limit du initialiserte i konstruktøren), og det neste elementet må vente til det er færre elementer i køen enn grensen, og først da kan det neste elementet legges til.

put()synkronisert metode som legger til elementer i køen hvis køgrensen ikke er overskredet, hvis den er det, pauser den køen

take()synkronisert metode som tar ut et element fra køen, returnerer det og fjerner det, hvis køen er tom, pauser den

Løsningshint

For å implementere put() bør du sjekke om køen er full, altså om den ikke er lik grensen, og hvis den er det, pause tråden. Hvis den ikke er full, bør du sjekke om køen er tom (isEmpty()) og hvis tråden er tom, kalle metoden som frigjør alle tråder (notifyAll()). Deretter legger du til elementet i queue.

For å implementere take() må du sjekke om køen er tom, hvis den er tom pauser du tråden (fordi det ikke er noe å lese), hvis køen ikke er tom gjør du en ny sjekk for om listen er komplett og hvis listen har størrelse lik limit, frigjør du alle tråder og returnerer første element i køen (det som ble lagt til sist av de andre).

Metoder du vil trenge å bruke

  • wait() - setter tråden på pause;
  • notifyAll()- vekker alle tråder som er satt på pause;
  • queue.isEmpty() - Sjekker om køen er tom (true - køen er tom).

Etter å ha brukt disse metodene og testet i Main-klassen, gå til /src/test/java/BlockingQueueueImplTest.java og kjør alle testene.

Hvis de kjøres uten feil, gratulerer, da har du gjort alt riktig! Hvis ikke, har du enten en feil løsning eller du har endret noe som ikke skulle vært endret.

Note
Merk

Prøv også å løse oppgaven selv, men hvis du ikke får det til og ønsker å se fasiten, finnes det en lenke til løsningen. Ikke bare kopier koden, men forsøk å forstå den!

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4
some-alt