Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Udfordring: Executors | Højniveausynkroniseringsmekanismer
Multitrådning i Java

bookUdfordring: Executors

Opgave

Forestil dig, at du har en liste af filer, hvor hver fil indeholder tekstlinjer. Din opgave er at læse linjer fra disse filer parallelt og tælle antallet af ord i hver linje. Brug ExecutorService, Future og en tråd-pool til at udføre opgaven.

Krav:

  • Opret en tråd-pool: Opret en tråd-pool med fast størrelse ved hjælp af Executors.newFixedThreadPool(int nThreads), hvor nThreads er antallet af tråde i poolen;

  • Opgaveimplementering: Implementér en WordCountTask-klasse, der implementerer Callable<String>-interfacet og modtager en fil som input. I call-metoden for denne klasse skal du læse linjer fra filen, tælle antallet af ord i hver linje og returnere resultatet;

  • Brug af ExecutorService: Ved brug af ExecutorService sendes opgaver til tråd-poolen for udførelse. Opgaverne skal bruge WordCountTask-klassen.

Note
Bemærk

Desuden skal den streng, du danner i en separat tråd, returneres og anvende get()-metoden fra Future-interfacet for at hente resultatet af trådens udførelse og udskrive det til konsollen i main-metoden.

Læs fra fil

For at implementere call() metoden kan du anvende BufferedReader til at læse strenge fra filer. Benyt et try-with-resources blok for automatisk at lukke ressourcerne for dig.

Main.java

Main.java

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

Brug readLine() metoden til at læse hver linje, og sørg for at kontrollere for null for at afgøre, hvornår du har nået slutningen af filen.

Dernæst opdel strengen i et array af strenge ved hjælp af split("\\s+") metoden med \\s+ mønsteret, som adskiller strengen efter mellemrum, og få derefter størrelsen på arrayet.

I selve strengen, som streamen returnerer, brug denne formatering

Main.java

Main.java

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

Filerne er allerede i projektet, du behøver ikke at oprette eller ændre dem!

Eksempeloutput

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
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 7

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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

bookUdfordring: Executors

Stryg for at vise menuen

Opgave

Forestil dig, at du har en liste af filer, hvor hver fil indeholder tekstlinjer. Din opgave er at læse linjer fra disse filer parallelt og tælle antallet af ord i hver linje. Brug ExecutorService, Future og en tråd-pool til at udføre opgaven.

Krav:

  • Opret en tråd-pool: Opret en tråd-pool med fast størrelse ved hjælp af Executors.newFixedThreadPool(int nThreads), hvor nThreads er antallet af tråde i poolen;

  • Opgaveimplementering: Implementér en WordCountTask-klasse, der implementerer Callable<String>-interfacet og modtager en fil som input. I call-metoden for denne klasse skal du læse linjer fra filen, tælle antallet af ord i hver linje og returnere resultatet;

  • Brug af ExecutorService: Ved brug af ExecutorService sendes opgaver til tråd-poolen for udførelse. Opgaverne skal bruge WordCountTask-klassen.

Note
Bemærk

Desuden skal den streng, du danner i en separat tråd, returneres og anvende get()-metoden fra Future-interfacet for at hente resultatet af trådens udførelse og udskrive det til konsollen i main-metoden.

Læs fra fil

For at implementere call() metoden kan du anvende BufferedReader til at læse strenge fra filer. Benyt et try-with-resources blok for automatisk at lukke ressourcerne for dig.

Main.java

Main.java

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

Brug readLine() metoden til at læse hver linje, og sørg for at kontrollere for null for at afgøre, hvornår du har nået slutningen af filen.

Dernæst opdel strengen i et array af strenge ved hjælp af split("\\s+") metoden med \\s+ mønsteret, som adskiller strengen efter mellemrum, og få derefter størrelsen på arrayet.

I selve strengen, som streamen returnerer, brug denne formatering

Main.java

Main.java

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

Filerne er allerede i projektet, du behøver ikke at oprette eller ændre dem!

Eksempeloutput

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
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 7
some-alt