Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Utfordring: Executorer | Høynivå Synkroniseringsmekanismer
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Multitråding i Java

bookUtfordring: Executorer

Oppgave

Tenk deg at du har en liste med filer, hvor hver fil inneholder tekstlinjer. Oppgaven er å lese linjer fra disse filene parallelt og telle antall ord i hver linje. Bruk ExecutorService, Future og en trådpool for å løse oppgaven.

Krav:

  • Opprett en trådpool: Opprett en trådpool med fast størrelse ved å bruke Executors.newFixedThreadPool(int nThreads), der nThreads er antall tråder i poolen;

  • Implementering av oppgave: Implementer en WordCountTask-klasse som implementerer Callable<String>-grensesnittet og mottar en fil som input. I call-metoden til denne klassen skal du lese linjer fra filen, telle antall ord i hver linje, og returnere resultatet;

  • Bruk av ExecutorService: Ved bruk av ExecutorService sendes jobber til trådpoolen for utførelse. Jobbene må bruke WordCountTask-klassen.

Note
Merk

Strengen som dannes i en separat tråd må returneres, og get()-metoden til Future-grensesnittet må brukes for å hente resultatet av trådens utførelse og skrive det ut til konsollen i main-metoden.

Les fra fil

For å implementere call()-metoden, kan du bruke BufferedReader for å lese strenger fra filer. Benytt en try-with-resources-blokk slik at ressursene automatisk blir lukket for deg.

Main.java

Main.java

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

Bruk readLine()-metoden for å lese hver linje, og sørg for å sjekke etter null for å avgjøre når du har nådd slutten av filen.

Deretter, del opp strengen i et array av strenger ved å bruke split("\\s+")-metoden med \\s+-mønsteret, som skiller strengen med mellomrom, og finn deretter størrelsen på arrayet.

I selve strengen, som strømmen returnerer, bruk denne formateringen

Main.java

Main.java

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

Filene er allerede i prosjektet, du trenger ikke å opprette eller endre dem!

Eksempelutdata

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
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 7

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

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?

bookUtfordring: Executorer

Sveip for å vise menyen

Oppgave

Tenk deg at du har en liste med filer, hvor hver fil inneholder tekstlinjer. Oppgaven er å lese linjer fra disse filene parallelt og telle antall ord i hver linje. Bruk ExecutorService, Future og en trådpool for å løse oppgaven.

Krav:

  • Opprett en trådpool: Opprett en trådpool med fast størrelse ved å bruke Executors.newFixedThreadPool(int nThreads), der nThreads er antall tråder i poolen;

  • Implementering av oppgave: Implementer en WordCountTask-klasse som implementerer Callable<String>-grensesnittet og mottar en fil som input. I call-metoden til denne klassen skal du lese linjer fra filen, telle antall ord i hver linje, og returnere resultatet;

  • Bruk av ExecutorService: Ved bruk av ExecutorService sendes jobber til trådpoolen for utførelse. Jobbene må bruke WordCountTask-klassen.

Note
Merk

Strengen som dannes i en separat tråd må returneres, og get()-metoden til Future-grensesnittet må brukes for å hente resultatet av trådens utførelse og skrive det ut til konsollen i main-metoden.

Les fra fil

For å implementere call()-metoden, kan du bruke BufferedReader for å lese strenger fra filer. Benytt en try-with-resources-blokk slik at ressursene automatisk blir lukket for deg.

Main.java

Main.java

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

Bruk readLine()-metoden for å lese hver linje, og sørg for å sjekke etter null for å avgjøre når du har nådd slutten av filen.

Deretter, del opp strengen i et array av strenger ved å bruke split("\\s+")-metoden med \\s+-mønsteret, som skiller strengen med mellomrom, og finn deretter størrelsen på arrayet.

I selve strengen, som strømmen returnerer, bruk denne formateringen

Main.java

Main.java

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

Filene er allerede i prosjektet, du trenger ikke å opprette eller endre dem!

Eksempelutdata

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
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 7
some-alt