Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Uitdaging: Executors | High-Level Synchronisatiemechanismen
Multithreading in Java

bookUitdaging: 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), waarbij nThreads het aantal threads in de pool is;

  • Taakimplementatie: Implementeer een WordCountTask-klasse die de interface Callable<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: Gebruik ExecutorService om taken naar de threadpool te sturen voor uitvoering. De taken moeten gebruikmaken van de klasse WordCountTask.

Note
Opmerking

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

Main.java

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

Main.java

copy
1
String.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
Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 7

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 3.33

bookUitdaging: 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), waarbij nThreads het aantal threads in de pool is;

  • Taakimplementatie: Implementeer een WordCountTask-klasse die de interface Callable<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: Gebruik ExecutorService om taken naar de threadpool te sturen voor uitvoering. De taken moeten gebruikmaken van de klasse WordCountTask.

Note
Opmerking

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

Main.java

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

Main.java

copy
1
String.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
Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 7
some-alt