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
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?

Awesome!

Completion rate improved to 3.33

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