Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Utmaning: Exekutorer | Hög-Nivå Synkroniseringsmekanismer
Multitrådning i Java

bookUtmaning: 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är nThreads är antalet trådar i poolen;

  • Uppgiftsimplementering: Implementera en klass WordCountTask som implementerar gränssnittet Callable<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änd ExecutorService för att skicka jobb till trådpoolen för exekvering. Jobben måste använda klassen WordCountTask.

Note
Observera

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

Main.java

copy
1
BufferedReader 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

Main.java

copy
1
String.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
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 7

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

bookUtmaning: 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är nThreads är antalet trådar i poolen;

  • Uppgiftsimplementering: Implementera en klass WordCountTask som implementerar gränssnittet Callable<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änd ExecutorService för att skicka jobb till trådpoolen för exekvering. Jobben måste använda klassen WordCountTask.

Note
Observera

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

Main.java

copy
1
BufferedReader 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

Main.java

copy
1
String.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
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 7
some-alt