Utmaning: Exekutorer
Uppgift
Föreställ dig att du har en lista med filer, där varje fil innehåller textrader. Din uppgift är att läsa rader från dessa filer parallellt och räkna antalet ord i varje rad. Använd ExecutorService, Future och en trådpool för att utföra uppgiften.
Krav:
-
Skapa en trådpool: Skapa en trådpool med fast storlek med hjälp av
Executors.newFixedThreadPool(int nThreads), därnThreadsär antalet trådar i poolen; -
Uppgiftsimplementering: Implementera en klass
WordCountTasksom implementerar gränssnittetCallable<String>och tar emot en fil som indata. I call-metoden för denna klass, läs rader från filen, räkna antalet ord i varje rad och returnera resultatet; -
Användning av
ExecutorService: AnvändExecutorServiceför att skicka jobb till trådpoolen för exekvering. Jobben måste använda klassenWordCountTask.
Dessutom måste strängen som du skapar i en separat tråd returneras och du ska använda metoden get() från gränssnittet Future för att hämta resultatet av trådens exekvering och skriva ut det till konsolen i main-metoden.
Läs från fil
För att implementera call() metoden kan du använda BufferedReader för att läsa strängar från filer. Använd ett try-with-resources block så att resurser automatiskt stängs åt dig.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Använd readLine()-metoden för att läsa varje rad, och kontrollera alltid efter null för att avgöra när slutet av filen har nåtts.
Dela därefter upp strängen i en array av strängar med hjälp av split("\\s+")-metoden med mönstret \\s+, vilket separerar strängen med mellanslag, och hämta sedan storleken på arrayen.
I själva strängen, som strömmen returnerar, använd denna formatering
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
Filerna finns redan i projektet, du behöver inte skapa eller ändra dem!
Exempelutdata
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
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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
Utmaning: Exekutorer
Svep för att visa menyn
Uppgift
Föreställ dig att du har en lista med filer, där varje fil innehåller textrader. Din uppgift är att läsa rader från dessa filer parallellt och räkna antalet ord i varje rad. Använd ExecutorService, Future och en trådpool för att utföra uppgiften.
Krav:
-
Skapa en trådpool: Skapa en trådpool med fast storlek med hjälp av
Executors.newFixedThreadPool(int nThreads), därnThreadsär antalet trådar i poolen; -
Uppgiftsimplementering: Implementera en klass
WordCountTasksom implementerar gränssnittetCallable<String>och tar emot en fil som indata. I call-metoden för denna klass, läs rader från filen, räkna antalet ord i varje rad och returnera resultatet; -
Användning av
ExecutorService: AnvändExecutorServiceför att skicka jobb till trådpoolen för exekvering. Jobben måste använda klassenWordCountTask.
Dessutom måste strängen som du skapar i en separat tråd returneras och du ska använda metoden get() från gränssnittet Future för att hämta resultatet av trådens exekvering och skriva ut det till konsolen i main-metoden.
Läs från fil
För att implementera call() metoden kan du använda BufferedReader för att läsa strängar från filer. Använd ett try-with-resources block så att resurser automatiskt stängs åt dig.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Använd readLine()-metoden för att läsa varje rad, och kontrollera alltid efter null för att avgöra när slutet av filen har nåtts.
Dela därefter upp strängen i en array av strängar med hjälp av split("\\s+")-metoden med mönstret \\s+, vilket separerar strängen med mellanslag, och hämta sedan storleken på arrayen.
I själva strängen, som strömmen returnerar, använd denna formatering
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
Filerna finns redan i projektet, du behöver inte skapa eller ändra dem!
Exempelutdata
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
Tack för dina kommentarer!