Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Herausforderung: Executor-Dienste | Hochrangige Synchronisationsmechanismen
Multithreading in Java

bookHerausforderung: Executor-Dienste

Aufgabe

Stellen Sie sich vor, Sie haben eine Liste von Dateien, von denen jede Textzeilen enthält. Ihre Aufgabe ist es, Zeilen aus diesen Dateien parallel zu lesen und die Anzahl der Wörter in jeder Zeile zu zählen. Verwenden Sie dazu ExecutorService, Future und einen Thread-Pool.

Anforderungen:

  • Thread-Pool erstellen: Erstellen Sie einen Thread-Pool mit fester Größe mit Executors.newFixedThreadPool(int nThreads), wobei nThreads die Anzahl der Threads im Pool ist;

  • Implementierung der Aufgabe: Implementieren Sie eine Klasse WordCountTask, die das Interface Callable<String> implementiert und eine Datei als Eingabe erhält. In der call-Methode dieser Klasse sollen die Zeilen der Datei gelesen, die Anzahl der Wörter in jeder Zeile gezählt und das Ergebnis zurückgegeben werden;

  • Verwendung von ExecutorService: Verwenden Sie ExecutorService, um Aufgaben zur Ausführung an den Thread-Pool zu übergeben. Die Aufgaben müssen die Klasse WordCountTask verwenden.

Note
Hinweis

Außerdem muss der String, den Sie in einem separaten Thread erzeugen, zurückgegeben werden. Verwenden Sie die Methode get() des Future-Interfaces, um das Ergebnis der Thread-Ausführung zu erhalten und in der main-Methode auf der Konsole auszugeben.

Aus Datei lesen

Zur Implementierung der call() Methode kann BufferedReader verwendet werden, um Zeichenketten aus Dateien zu lesen. Verwenden Sie einen try-with-resources Block, damit Ressourcen automatisch für Sie geschlossen werden.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Verwenden Sie die Methode readLine(), um jede Zeile zu lesen, und achten Sie darauf, auf null zu prüfen, um das Ende der Datei zu erkennen.

Anschließend die Zeichenkette aufteilen in ein Array von Zeichenketten mit der Methode split("\\s+") und dem Muster \\s+, das die Zeichenkette anhand von Leerzeichen trennt, und dann die Größe des Arrays ermitteln.

Im eigentlichen String, den der Stream zurückgibt, dieses Format verwenden

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Dateien sind bereits im Projekt vorhanden, Sie müssen sie nicht erstellen oder ändern!

Beispielausgabe

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
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 7

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

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

bookHerausforderung: Executor-Dienste

Swipe um das Menü anzuzeigen

Aufgabe

Stellen Sie sich vor, Sie haben eine Liste von Dateien, von denen jede Textzeilen enthält. Ihre Aufgabe ist es, Zeilen aus diesen Dateien parallel zu lesen und die Anzahl der Wörter in jeder Zeile zu zählen. Verwenden Sie dazu ExecutorService, Future und einen Thread-Pool.

Anforderungen:

  • Thread-Pool erstellen: Erstellen Sie einen Thread-Pool mit fester Größe mit Executors.newFixedThreadPool(int nThreads), wobei nThreads die Anzahl der Threads im Pool ist;

  • Implementierung der Aufgabe: Implementieren Sie eine Klasse WordCountTask, die das Interface Callable<String> implementiert und eine Datei als Eingabe erhält. In der call-Methode dieser Klasse sollen die Zeilen der Datei gelesen, die Anzahl der Wörter in jeder Zeile gezählt und das Ergebnis zurückgegeben werden;

  • Verwendung von ExecutorService: Verwenden Sie ExecutorService, um Aufgaben zur Ausführung an den Thread-Pool zu übergeben. Die Aufgaben müssen die Klasse WordCountTask verwenden.

Note
Hinweis

Außerdem muss der String, den Sie in einem separaten Thread erzeugen, zurückgegeben werden. Verwenden Sie die Methode get() des Future-Interfaces, um das Ergebnis der Thread-Ausführung zu erhalten und in der main-Methode auf der Konsole auszugeben.

Aus Datei lesen

Zur Implementierung der call() Methode kann BufferedReader verwendet werden, um Zeichenketten aus Dateien zu lesen. Verwenden Sie einen try-with-resources Block, damit Ressourcen automatisch für Sie geschlossen werden.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Verwenden Sie die Methode readLine(), um jede Zeile zu lesen, und achten Sie darauf, auf null zu prüfen, um das Ende der Datei zu erkennen.

Anschließend die Zeichenkette aufteilen in ein Array von Zeichenketten mit der Methode split("\\s+") und dem Muster \\s+, das die Zeichenkette anhand von Leerzeichen trennt, und dann die Größe des Arrays ermitteln.

Im eigentlichen String, den der Stream zurückgibt, dieses Format verwenden

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Dateien sind bereits im Projekt vorhanden, Sie müssen sie nicht erstellen oder ändern!

Beispielausgabe

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
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 7
some-alt