Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: Executorit | Korkean Tason Synkronointimekanismit
Monisäikeisyys Javassa

bookHaaste: Executorit

Tehtävä

Kuvittele, että sinulla on tiedostolista, joista jokainen sisältää tekstirivejä. Tehtävänäsi on lukea rivit näistä tiedostoista rinnakkain ja laskea sanojen määrä jokaisella rivillä. Käytä ExecutorService-rajapintaa, Future-olioita ja säieallasta tehtävän suorittamiseen.

Vaatimukset:

  • Luo säieallas: Luo kiinteän kokoinen säieallas käyttämällä Executors.newFixedThreadPool(int nThreads), missä nThreads on säikeiden määrä altaassa;

  • Tehtävän toteutus: Toteuta WordCountTask-luokka, joka toteuttaa Callable<String>-rajapinnan ja vastaanottaa tiedoston syötteenä. Tämän luokan call-metodissa lue rivit tiedostosta, laske sanojen määrä jokaisella rivillä ja palauta tulos;

  • Käytä ExecutorService-rajapintaa: Käytä ExecutorService-rajapintaa lähettääksesi tehtäviä säiealtaaseen suoritettavaksi. Tehtävien tulee käyttää WordCountTask-luokkaa.

Note
Huomio

Lisäksi merkkijono, jonka muodostaa erillisessä säikeessä, tulee palauttaa ja käyttää get()-rajapinnan Future-metodia saadaksesi säikeen suorituksen tuloksen ja tulostaa se konsoliin main-metodissa.

Lue tiedostosta

call()-metodin toteuttamiseen voidaan käyttää BufferedReader-luokkaa merkkijonojen lukemiseen tiedostoista. Käytä try-with-resources-lohkoa, jotta resurssit suljetaan automaattisesti puolestasi.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Käytä readLine()-metodia lukeaksesi jokaisen rivin ja varmista, että tarkistat null-arvon selvittääksesi, milloin olet saavuttanut tiedoston lopun.

Seuraavaksi jaa merkkijono merkkijonotaulukoksi käyttämällä split("\\s+")-metodia ja \\s+-kuviota, joka erottaa merkkijonon välilyönneillä, ja ota sitten taulukon koko.

Merkkijonossa itsessään, jonka virta palauttaa, käytä tätä muotoilua

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Tiedostot ovat jo projektissa, sinun ei tarvitse luoda tai muokata niitä!

Esimerkkituloste

File: file1.txt | Line: Hello | Word Count: 1

File: file2.txt | Line: Hello I Love Java | Word Count: 4
File: file2.txt | Line: Lol Hello | Word Count: 2

File: file3.txt | Line: Java so so so so very nice | Word Count: 7
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 7

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: Executorit

Pyyhkäise näyttääksesi valikon

Tehtävä

Kuvittele, että sinulla on tiedostolista, joista jokainen sisältää tekstirivejä. Tehtävänäsi on lukea rivit näistä tiedostoista rinnakkain ja laskea sanojen määrä jokaisella rivillä. Käytä ExecutorService-rajapintaa, Future-olioita ja säieallasta tehtävän suorittamiseen.

Vaatimukset:

  • Luo säieallas: Luo kiinteän kokoinen säieallas käyttämällä Executors.newFixedThreadPool(int nThreads), missä nThreads on säikeiden määrä altaassa;

  • Tehtävän toteutus: Toteuta WordCountTask-luokka, joka toteuttaa Callable<String>-rajapinnan ja vastaanottaa tiedoston syötteenä. Tämän luokan call-metodissa lue rivit tiedostosta, laske sanojen määrä jokaisella rivillä ja palauta tulos;

  • Käytä ExecutorService-rajapintaa: Käytä ExecutorService-rajapintaa lähettääksesi tehtäviä säiealtaaseen suoritettavaksi. Tehtävien tulee käyttää WordCountTask-luokkaa.

Note
Huomio

Lisäksi merkkijono, jonka muodostaa erillisessä säikeessä, tulee palauttaa ja käyttää get()-rajapinnan Future-metodia saadaksesi säikeen suorituksen tuloksen ja tulostaa se konsoliin main-metodissa.

Lue tiedostosta

call()-metodin toteuttamiseen voidaan käyttää BufferedReader-luokkaa merkkijonojen lukemiseen tiedostoista. Käytä try-with-resources-lohkoa, jotta resurssit suljetaan automaattisesti puolestasi.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Käytä readLine()-metodia lukeaksesi jokaisen rivin ja varmista, että tarkistat null-arvon selvittääksesi, milloin olet saavuttanut tiedoston lopun.

Seuraavaksi jaa merkkijono merkkijonotaulukoksi käyttämällä split("\\s+")-metodia ja \\s+-kuviota, joka erottaa merkkijonon välilyönneillä, ja ota sitten taulukon koko.

Merkkijonossa itsessään, jonka virta palauttaa, käytä tätä muotoilua

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Tiedostot ovat jo projektissa, sinun ei tarvitse luoda tai muokata niitä!

Esimerkkituloste

File: file1.txt | Line: Hello | Word Count: 1

File: file2.txt | Line: Hello I Love Java | Word Count: 4
File: file2.txt | Line: Lol Hello | Word Count: 2

File: file3.txt | Line: Java so so so so very nice | Word Count: 7
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 7
some-alt