Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: Estävä jono | Synkronoidut Kokoelmat
Monisäikeisyys Javassa

bookHaaste: Estävä jono

Tehtävä

Sinun tulee toteuttaa joitakin BlockingQueue-luokan metodeja, jotta ymmärrät paremmin, miten kokoelma toimii ja opit materiaalin tehokkaammin!

Sinun tulee siirtyä luokkaan BlockingQueueueImpl, jossa on 2 toteuttamatonta metodia, jotka sinun täytyy itse toteuttaa. Sinun ei tarvitse keksiä monimutkaista ratkaisua, vaan riittää, että toistat tavallisen BlockingQueueue-luokan toiminnallisuuden.

Note
Huomio

Sinulla on myös Main-luokka, jossa sinun tulee testata BlockingQueueueImpl-toteutustasi varmistaaksesi, että se toimii oikein.

Tämän voi tarkistaa lisäämällä jonoon (queue) yli 10 alkiota (tai enemmän kuin konstruktorissa määritelty limit). Seuraavan alkion lisääminen joutuu odottamaan, kunnes jonossa on vähemmän alkioita kuin raja-arvo, ja vasta sitten seuraava alkio voidaan lisätä.

put()synkronoitu metodi, joka lisää alkioita jonoon, jos jonon raja-arvoa ei ylitetä. Jos raja ylittyy, jono pysäytetään.

take()synkronoitu metodi, joka ottaa alkion jonosta, palauttaa ja poistaa sen. Jos jono on tyhjä, pysäyttää sen.

Ratkaisuvinkki

put()-metodin toteuttamiseksi tulee tarkistaa onko jono täynnä, eli onko sen koko yhtä suuri kuin raja-arvo. Jos on, säie pysäytetään. Jos jono ei ole täynnä, tarkista onko jono tyhjä (isEmpty()) ja jos se on, kutsu metodia, joka vapauttaa kaikki säikeet (notifyAll()). Tämän jälkeen lisää alkio queue:een.

take()-metodin toteuttamiseksi tulee tarkistaa onko jono tyhjä. Jos jono on tyhjä, säie pysäytetään (koska ei ole mitään luettavaa). Jos jono ei ole tyhjä, tarkista vielä listan täydellisyys ja jos listan koko on yhtä suuri kuin limit, vapauta kaikki säikeet ja palauta ensimmäinen alkio jonosta (se, joka lisättiin aikaisemmin kuin muut).

Tarvittavat metodit

  • wait() – keskeyttää säikeen;
  • notifyAll() – herättää kaikki keskeytetyt säikeet;
  • queue.isEmpty() – tarkistaa, onko jono tyhjä (true – jono on tyhjä).

Kun olet toteuttanut nämä metodit ja testannut niitä Main-luokassa, siirry tiedostoon /src/test/java/BlockingQueueueImplTest.java ja suorita kaikki testit.

Jos ne onnistuvat, onnittelut – teit kaiken oikein! Jos eivät, ratkaisusi on joko väärä tai olet muuttanut jotakin, mitä ei olisi pitänyt muuttaa.

Note
Huomio

Yritä ratkaista tehtävä myös itse, mutta jos et onnistu ja haluat tietää vastauksen, löydät ratkaisun linkin. Älä kuitenkaan vain kopioi koodia, vaan yritä ymmärtää se!

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 3.33

bookHaaste: Estävä jono

Pyyhkäise näyttääksesi valikon

Tehtävä

Sinun tulee toteuttaa joitakin BlockingQueue-luokan metodeja, jotta ymmärrät paremmin, miten kokoelma toimii ja opit materiaalin tehokkaammin!

Sinun tulee siirtyä luokkaan BlockingQueueueImpl, jossa on 2 toteuttamatonta metodia, jotka sinun täytyy itse toteuttaa. Sinun ei tarvitse keksiä monimutkaista ratkaisua, vaan riittää, että toistat tavallisen BlockingQueueue-luokan toiminnallisuuden.

Note
Huomio

Sinulla on myös Main-luokka, jossa sinun tulee testata BlockingQueueueImpl-toteutustasi varmistaaksesi, että se toimii oikein.

Tämän voi tarkistaa lisäämällä jonoon (queue) yli 10 alkiota (tai enemmän kuin konstruktorissa määritelty limit). Seuraavan alkion lisääminen joutuu odottamaan, kunnes jonossa on vähemmän alkioita kuin raja-arvo, ja vasta sitten seuraava alkio voidaan lisätä.

put()synkronoitu metodi, joka lisää alkioita jonoon, jos jonon raja-arvoa ei ylitetä. Jos raja ylittyy, jono pysäytetään.

take()synkronoitu metodi, joka ottaa alkion jonosta, palauttaa ja poistaa sen. Jos jono on tyhjä, pysäyttää sen.

Ratkaisuvinkki

put()-metodin toteuttamiseksi tulee tarkistaa onko jono täynnä, eli onko sen koko yhtä suuri kuin raja-arvo. Jos on, säie pysäytetään. Jos jono ei ole täynnä, tarkista onko jono tyhjä (isEmpty()) ja jos se on, kutsu metodia, joka vapauttaa kaikki säikeet (notifyAll()). Tämän jälkeen lisää alkio queue:een.

take()-metodin toteuttamiseksi tulee tarkistaa onko jono tyhjä. Jos jono on tyhjä, säie pysäytetään (koska ei ole mitään luettavaa). Jos jono ei ole tyhjä, tarkista vielä listan täydellisyys ja jos listan koko on yhtä suuri kuin limit, vapauta kaikki säikeet ja palauta ensimmäinen alkio jonosta (se, joka lisättiin aikaisemmin kuin muut).

Tarvittavat metodit

  • wait() – keskeyttää säikeen;
  • notifyAll() – herättää kaikki keskeytetyt säikeet;
  • queue.isEmpty() – tarkistaa, onko jono tyhjä (true – jono on tyhjä).

Kun olet toteuttanut nämä metodit ja testannut niitä Main-luokassa, siirry tiedostoon /src/test/java/BlockingQueueueImplTest.java ja suorita kaikki testit.

Jos ne onnistuvat, onnittelut – teit kaiken oikein! Jos eivät, ratkaisusi on joko väärä tai olet muuttanut jotakin, mitä ei olisi pitänyt muuttaa.

Note
Huomio

Yritä ratkaista tehtävä myös itse, mutta jos et onnistu ja haluat tietää vastauksen, löydät ratkaisun linkin. Älä kuitenkaan vain kopioi koodia, vaan yritä ymmärtää se!

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 4
some-alt