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

Suggested prompts:

Can you show me how to implement the WordCountTask class?

How do I use ExecutorService to run the WordCountTask for multiple files?

Can you explain how to format the output for each line as shown in the example?

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