Udfordring: 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), hvornThreadser antallet af tråde i poolen; -
Opgaveimplementering: Implementér en
WordCountTask-klasse, der implementererCallable<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 afExecutorServicesendes opgaver til tråd-poolen for udførelse. Opgaverne skal brugeWordCountTask-klassen.
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
1BufferedReader 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
1String.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
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
Udfordring: 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), hvornThreadser antallet af tråde i poolen; -
Opgaveimplementering: Implementér en
WordCountTask-klasse, der implementererCallable<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 afExecutorServicesendes opgaver til tråd-poolen for udførelse. Opgaverne skal brugeWordCountTask-klassen.
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
1BufferedReader 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
1String.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
Tak for dine kommentarer!