Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Utmaning: ForkJoinPool | Bästa Praxis För Multitrådning
Multitrådning i Java

bookUtmaning: ForkJoinPool

Uppgift

Föreställ dig att du organiserar ett stort välgörenhetsevenemang och behöver summera alla donationer som tagits emot. Du har en lista med donationsbelopp och vill ta reda på den totala summan av alla donationer. För att göra uppgiften mer hanterbar bestämmer du dig för att dela upp listan i mindre delar och fördela dessa delar bland dina vänner för att hjälpa till med räkningen. Varje vän beräknar det totala beloppet för sin tilldelade del och rapporterar resultatet tillbaka till dig. Du kombinerar sedan alla dessa resultat för att få fram slutsumman.

Du har en klass DonationTask som ärver från RecursiveTask<Long>. Du behöver överskrida metoden compute() i denna klass för att implementera logiken för att dela upp donationslistan och beräkna beloppen.

Klassen DonationTask innehåller ett konstant fält THRESHOLD satt till 200. Denna tröskel anger det maximala antalet donationer som en enskild del får innehålla. Ändra inte denna tröskel.

Till exempel, om du börjar med en lista på 1 000 donationer, ska du dela upp den i delar om 200 eller färre donationer vardera. Sedan beräknar du det totala beloppet genom att summera resultaten från varje del.

  • THRESHOLD - tröskelvärde för arrayuppdelning;
  • long[] listDonations - källarray med alla donationer;
  • int start - början av arrayen;
  • int end - slutet av arrayen.

Det finns också en klass RunnableTask där vi kör programmet. Här initierar vi vår lista och exekverar den i en ForkJoinPool. När allt är igång visar vi resultatet.

Om du implementerar metoden compute() korrekt, bör du få den totala summan:

Sum: 500500 

Lösningshintar

I metoden compute() behöver vi kontrollera om storleken på vår array (donationslista) är mindre än det aktuella tröskelvärdet, THRESHOLD. Om den är mindre, utmärkt; vi loopar helt enkelt igenom alla element i denna array (donationslista), summerar dem och returnerar resultatet.

Om storleken är större behöver vi hitta mitten av arrayen och rekursivt bearbeta vänster och höger sida av arrayen (som om vi delar upp listan mellan vänner).

För att göra detta skapar vi 2 DonationTask-objekt, skickar arraygränserna och själva arrayen som parametrar, och anropar sedan metoden fork() på dessa objekt. Slutligen får vi summaresultatet genom att anropa join() på varje uppgift, addera resultaten och returnera totalsumman.

Note
Notering

Det låter ganska komplicerat, men i själva verket behöver du bara förstå och implementera illustrationen ovan!

Jag är säker på att du klarar det! Men om du stöter på svårigheter kan du titta på lösningen.

När du är säker på att allt fungerar, kör verifieringstesterna på sökvägen /src/test/java/TaskForkJoinTest.java.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 3.33

bookUtmaning: ForkJoinPool

Svep för att visa menyn

Uppgift

Föreställ dig att du organiserar ett stort välgörenhetsevenemang och behöver summera alla donationer som tagits emot. Du har en lista med donationsbelopp och vill ta reda på den totala summan av alla donationer. För att göra uppgiften mer hanterbar bestämmer du dig för att dela upp listan i mindre delar och fördela dessa delar bland dina vänner för att hjälpa till med räkningen. Varje vän beräknar det totala beloppet för sin tilldelade del och rapporterar resultatet tillbaka till dig. Du kombinerar sedan alla dessa resultat för att få fram slutsumman.

Du har en klass DonationTask som ärver från RecursiveTask<Long>. Du behöver överskrida metoden compute() i denna klass för att implementera logiken för att dela upp donationslistan och beräkna beloppen.

Klassen DonationTask innehåller ett konstant fält THRESHOLD satt till 200. Denna tröskel anger det maximala antalet donationer som en enskild del får innehålla. Ändra inte denna tröskel.

Till exempel, om du börjar med en lista på 1 000 donationer, ska du dela upp den i delar om 200 eller färre donationer vardera. Sedan beräknar du det totala beloppet genom att summera resultaten från varje del.

  • THRESHOLD - tröskelvärde för arrayuppdelning;
  • long[] listDonations - källarray med alla donationer;
  • int start - början av arrayen;
  • int end - slutet av arrayen.

Det finns också en klass RunnableTask där vi kör programmet. Här initierar vi vår lista och exekverar den i en ForkJoinPool. När allt är igång visar vi resultatet.

Om du implementerar metoden compute() korrekt, bör du få den totala summan:

Sum: 500500 

Lösningshintar

I metoden compute() behöver vi kontrollera om storleken på vår array (donationslista) är mindre än det aktuella tröskelvärdet, THRESHOLD. Om den är mindre, utmärkt; vi loopar helt enkelt igenom alla element i denna array (donationslista), summerar dem och returnerar resultatet.

Om storleken är större behöver vi hitta mitten av arrayen och rekursivt bearbeta vänster och höger sida av arrayen (som om vi delar upp listan mellan vänner).

För att göra detta skapar vi 2 DonationTask-objekt, skickar arraygränserna och själva arrayen som parametrar, och anropar sedan metoden fork() på dessa objekt. Slutligen får vi summaresultatet genom att anropa join() på varje uppgift, addera resultaten och returnera totalsumman.

Note
Notering

Det låter ganska komplicerat, men i själva verket behöver du bara förstå och implementera illustrationen ovan!

Jag är säker på att du klarar det! Men om du stöter på svårigheter kan du titta på lösningen.

När du är säker på att allt fungerar, kör verifieringstesterna på sökvägen /src/test/java/TaskForkJoinTest.java.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3
some-alt