Uitdaging: Executors
Taak
Stel je voor dat je een lijst met bestanden hebt, elk met tekstregels. Je taak is om regels te lezen uit deze bestanden in parallel en het aantal woorden in elke regel te tellen. Gebruik ExecutorService, Future en een threadpool om deze taak uit te voeren.
Vereisten:
-
Maak een threadpool aan: Maak een threadpool met vaste grootte aan met behulp van
Executors.newFixedThreadPool(int nThreads), waarbijnThreadshet aantal threads in de pool is; -
Taakimplementatie: Implementeer een
WordCountTask-klasse die de interfaceCallable<String>implementeert en een bestand als invoer ontvangt. In de call-methode van deze klasse, lees regels uit het bestand, tel het aantal woorden in elke regel en retourneer het resultaat; -
Gebruik van
ExecutorService: GebruikExecutorServiceom taken naar de threadpool te sturen voor uitvoering. De taken moeten gebruikmaken van de klasseWordCountTask.
Ook moet de string die je in een aparte thread vormt, worden geretourneerd en moet je de get()-methode van de Future-interface gebruiken om het resultaat van de thread-uitvoering op te halen en in de main-methode naar de console uit te voeren.
Lezen uit bestand
Voor het implementeren van de call() methode kan BufferedReader worden gebruikt om strings uit bestanden te lezen. Gebruik een try-with-resources blok zodat resources automatisch voor je worden gesloten.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Gebruik de readLine() methode om elke regel te lezen, en controleer op null om te bepalen wanneer het einde van het bestand is bereikt.
Splits vervolgens de string in een array van strings met behulp van de split("\\s+") methode met het \\s+ patroon, dat de string op spaties splitst, en bepaal daarna de grootte van de array.
Gebruik deze opmaak in de string zelf, die de stream retourneert
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
Bestanden zijn al in het project, je hoeft ze niet aan te maken of te wijzigen!
Voorbeelduitvoer
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
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 3.33
Uitdaging: Executors
Veeg om het menu te tonen
Taak
Stel je voor dat je een lijst met bestanden hebt, elk met tekstregels. Je taak is om regels te lezen uit deze bestanden in parallel en het aantal woorden in elke regel te tellen. Gebruik ExecutorService, Future en een threadpool om deze taak uit te voeren.
Vereisten:
-
Maak een threadpool aan: Maak een threadpool met vaste grootte aan met behulp van
Executors.newFixedThreadPool(int nThreads), waarbijnThreadshet aantal threads in de pool is; -
Taakimplementatie: Implementeer een
WordCountTask-klasse die de interfaceCallable<String>implementeert en een bestand als invoer ontvangt. In de call-methode van deze klasse, lees regels uit het bestand, tel het aantal woorden in elke regel en retourneer het resultaat; -
Gebruik van
ExecutorService: GebruikExecutorServiceom taken naar de threadpool te sturen voor uitvoering. De taken moeten gebruikmaken van de klasseWordCountTask.
Ook moet de string die je in een aparte thread vormt, worden geretourneerd en moet je de get()-methode van de Future-interface gebruiken om het resultaat van de thread-uitvoering op te halen en in de main-methode naar de console uit te voeren.
Lezen uit bestand
Voor het implementeren van de call() methode kan BufferedReader worden gebruikt om strings uit bestanden te lezen. Gebruik een try-with-resources blok zodat resources automatisch voor je worden gesloten.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Gebruik de readLine() methode om elke regel te lezen, en controleer op null om te bepalen wanneer het einde van het bestand is bereikt.
Splits vervolgens de string in een array van strings met behulp van de split("\\s+") methode met het \\s+ patroon, dat de string op spaties splitst, en bepaal daarna de grootte van de array.
Gebruik deze opmaak in de string zelf, die de stream retourneert
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
Bestanden zijn al in het project, je hoeft ze niet aan te maken of te wijzigen!
Voorbeelduitvoer
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
Bedankt voor je feedback!