Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Uitdaging: Forkjoinpool | Best Practices voor Multithreading
Multithreading in Java

bookUitdaging: Forkjoinpool

Taak

Stel je voor dat je een groot liefdadigheidsevenement organiseert en alle ontvangen donaties moet optellen. Je hebt een lijst met donatiebedragen en wilt de totale som van alle donaties weten. Om deze taak beheersbaar te maken, besluit je de lijst in kleinere stukken te verdelen en deze stukken onder je vrienden te verdelen om te helpen met het tellen. Elke vriend berekent het totaalbedrag voor zijn toegewezen stuk en rapporteert het resultaat aan jou. Vervolgens combineer je al deze resultaten om het eindtotaal te krijgen.

Je hebt een DonationTask klasse die RecursiveTask<Long> uitbreidt. Je moet de compute()-methode in deze klasse overschrijven om de logica te implementeren voor het splitsen van de donatielijst en het berekenen van de bedragen.

De DonationTask klasse bevat een constante THRESHOLD-veld ingesteld op 200. Deze drempel geeft het maximale aantal donaties aan dat een enkel stuk mag bevatten. Wijzig deze drempel niet.

Bijvoorbeeld, als je begint met een lijst van 1.000 donaties, moet je deze opdelen in stukken van 200 of minder donaties per stuk. Tel vervolgens het totale bedrag op door de resultaten van elk stuk bij elkaar op te tellen.

  • THRESHOLD - drempel voor het splitsen van de array;
  • long[] listDonations - bronarray met alle donaties;
  • int start - het begin van de array;
  • int end - einde van de array.

Er is ook een RunnableTask klasse waarin we het programma uitvoeren. Hier initialiseren we onze lijst en voeren deze uit in een ForkJoinPool. Nadat alles is gestart, tonen we het resultaat.

Als je de compute()-methode correct implementeert, krijg je het totale bedrag:

Sum: 500500 

Oplossingsaanwijzingen

In de compute() methode moeten we controleren of de grootte van onze array (donatielijst) kleiner is dan de huidige drempel, THRESHOLD. Als deze kleiner is, dan is dat prima; we lopen eenvoudig door alle elementen van deze array (donatielijst), tellen ze op en geven het resultaat terug.

Als de grootte groter is, moeten we het midden van de array vinden en de linker en rechter zijde van de array recursief verwerken (alsof we de lijst onder vrienden verdelen).

Hiervoor maken we 2 DonationTask-objecten aan, geven de arraygrenzen en de array zelf als parameters door, en roepen vervolgens de fork()-methode aan op deze objecten. Tot slot verkrijgen we het somresultaat door join() op elke taak aan te roepen, de resultaten op te tellen en het totaal terug te geven.

Note
Opmerking

Het klinkt behoorlijk ingewikkeld, maar in feite hoef je alleen de bovenstaande illustratie te begrijpen en te implementeren!

Ik weet zeker dat het je lukt! Maar als je problemen ondervindt, kun je de oplossing bekijken.

Zodra je zeker weet dat alles werkt, voer je de verificatietests uit op het pad /src/test/java/TaskForkJoinTest.java.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 3

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: Forkjoinpool

Veeg om het menu te tonen

Taak

Stel je voor dat je een groot liefdadigheidsevenement organiseert en alle ontvangen donaties moet optellen. Je hebt een lijst met donatiebedragen en wilt de totale som van alle donaties weten. Om deze taak beheersbaar te maken, besluit je de lijst in kleinere stukken te verdelen en deze stukken onder je vrienden te verdelen om te helpen met het tellen. Elke vriend berekent het totaalbedrag voor zijn toegewezen stuk en rapporteert het resultaat aan jou. Vervolgens combineer je al deze resultaten om het eindtotaal te krijgen.

Je hebt een DonationTask klasse die RecursiveTask<Long> uitbreidt. Je moet de compute()-methode in deze klasse overschrijven om de logica te implementeren voor het splitsen van de donatielijst en het berekenen van de bedragen.

De DonationTask klasse bevat een constante THRESHOLD-veld ingesteld op 200. Deze drempel geeft het maximale aantal donaties aan dat een enkel stuk mag bevatten. Wijzig deze drempel niet.

Bijvoorbeeld, als je begint met een lijst van 1.000 donaties, moet je deze opdelen in stukken van 200 of minder donaties per stuk. Tel vervolgens het totale bedrag op door de resultaten van elk stuk bij elkaar op te tellen.

  • THRESHOLD - drempel voor het splitsen van de array;
  • long[] listDonations - bronarray met alle donaties;
  • int start - het begin van de array;
  • int end - einde van de array.

Er is ook een RunnableTask klasse waarin we het programma uitvoeren. Hier initialiseren we onze lijst en voeren deze uit in een ForkJoinPool. Nadat alles is gestart, tonen we het resultaat.

Als je de compute()-methode correct implementeert, krijg je het totale bedrag:

Sum: 500500 

Oplossingsaanwijzingen

In de compute() methode moeten we controleren of de grootte van onze array (donatielijst) kleiner is dan de huidige drempel, THRESHOLD. Als deze kleiner is, dan is dat prima; we lopen eenvoudig door alle elementen van deze array (donatielijst), tellen ze op en geven het resultaat terug.

Als de grootte groter is, moeten we het midden van de array vinden en de linker en rechter zijde van de array recursief verwerken (alsof we de lijst onder vrienden verdelen).

Hiervoor maken we 2 DonationTask-objecten aan, geven de arraygrenzen en de array zelf als parameters door, en roepen vervolgens de fork()-methode aan op deze objecten. Tot slot verkrijgen we het somresultaat door join() op elke taak aan te roepen, de resultaten op te tellen en het totaal terug te geven.

Note
Opmerking

Het klinkt behoorlijk ingewikkeld, maar in feite hoef je alleen de bovenstaande illustratie te begrijpen en te implementeren!

Ik weet zeker dat het je lukt! Maar als je problemen ondervindt, kun je de oplossing bekijken.

Zodra je zeker weet dat alles werkt, voer je de verificatietests uit op het pad /src/test/java/TaskForkJoinTest.java.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 3
some-alt