Haaste: 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.
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.
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!
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 3.33
Haaste: 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.
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.
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!
Kiitos palautteestasi!