Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Herausforderung ForkJoinPool | Best Practices für Multithreading
Multithreading in Java
course content

Kursinhalt

Multithreading in Java

Multithreading in Java

1. Grundlagen der Multithread-Verarbeitung
2. Synchronisierte Sammlungen
3. Hochrangige Synchronisationsmechanismen
4. Best Practices für Multithreading

book
Herausforderung ForkJoinPool

Aufgabe

Stellen Sie sich vor, Sie organisieren eine große Wohltätigkeitsveranstaltung und müssen alle eingegangenen Spenden zusammenzählen. Sie haben eine Liste von Spendenbeträgen und möchten die Gesamtsumme aller Spenden herausfinden. Um diese Aufgabe überschaubarer zu machen, entscheiden Sie sich, die Liste in kleinere Teile zu teilen und diese Teile unter Ihren Freunden zu verteilen, um bei der Zählung zu helfen. Jeder Freund berechnet den Gesamtbetrag für seinen zugewiesenen Teil und meldet das Ergebnis an Sie zurück. Sie kombinieren dann alle diese Ergebnisse, um die endgültige Gesamtsumme zu erhalten.

Sie haben eine DonationTask Klasse, die RecursiveTask<Long> erweitert. Sie müssen die compute() Methode in dieser Klasse überschreiben, um die Logik für das Teilen der Spendenliste und das Berechnen der Beträge zu implementieren.

Die DonationTask Klasse enthält ein konstantes THRESHOLD Feld, das auf 200 gesetzt ist. Diese Schwelle gibt die maximale Anzahl von Spenden an, die ein einzelner Teil enthalten sollte. Ändern Sie diese Schwelle nicht.

Zum Beispiel, wenn Sie mit einer Liste von 1.000 Spenden beginnen, sollten Sie sie in Teile von 200 oder weniger Spenden aufteilen. Dann berechnen Sie den Gesamtbetrag, indem Sie die Ergebnisse aus jedem Teil addieren.

  • THRESHOLD - Schwellenwert der Array-Aufteilung;
  • long[] listDonations - Quellarray mit allen Spenden;
  • int start - der Anfang des Arrays;
  • int end - Ende des Arrays.

Es gibt auch eine RunnableTask Klasse, in der wir das Programm ausführen. Hier initialisieren wir unsere Liste und führen sie in einem ForkJoinPool aus. Nachdem alles läuft, zeigen wir das Ergebnis an.

Wenn Sie die compute()-Methode korrekt implementieren, sollten Sie die Gesamtsumme erhalten:

Lösungshinweise

In der compute() Methode müssen wir überprüfen, ob die Größe unseres Arrays (Spendenliste) kleiner ist als der aktuelle Schwellenwert, THRESHOLD. Wenn sie kleiner ist, großartig; wir durchlaufen einfach alle Elemente dieses Arrays (Spendenliste), summieren sie und geben das Ergebnis zurück.

Wenn die Größe größer ist, müssen wir die Mitte des Arrays finden und die linke und rechte Seite des Arrays rekursiv verarbeiten (als ob wir die Liste unter Freunden aufteilen).

Dazu erstellen wir 2 DonationTask Objekte, übergeben die Array-Grenzen und das Array selbst als Parameter, und rufen dann die fork() Methode auf diesen Objekten auf. Schließlich erhalten wir das Summen-Ergebnis, indem wir join() auf jede Aufgabe aufrufen, die Ergebnisse zusammen addieren und die Gesamtsumme zurückgeben.

Hinweis

Es klingt ziemlich kompliziert, aber in Wirklichkeit müssen Sie nur die oben gezeigte Illustration verstehen und umsetzen!

Ich bin sicher, dass Sie es schaffen! Aber wenn Sie Schwierigkeiten haben, können Sie die Lösung ansehen.

Sobald Sie sicher sind, dass alles funktioniert, führen Sie die Verifikationstests auf dem Pfad /src/test/java/TaskForkJoinTest.java aus.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 3
We're sorry to hear that something went wrong. What happened?
some-alt