Udfordring: ForkJoinPool
Opgave
Forestil dig, at du organiserer et stort velgørenhedsarrangement og skal optælle alle de donationer, der er modtaget. Du har en liste over donationsbeløb og ønsker at finde ud af den samlede sum af alle donationer. For at gøre denne opgave mere overskuelig beslutter du at opdele listen i mindre dele og fordele disse dele blandt dine venner for at hjælpe med optællingen. Hver ven beregner det samlede beløb for deres tildelte del og rapporterer resultatet tilbage til dig. Du kombinerer derefter alle disse resultater for at få det endelige totalbeløb.
Du har en DonationTask klasse, der udvider RecursiveTask<Long>. Du skal overskrive compute()-metoden i denne klasse for at implementere logikken til opdeling af donationslisten og beregning af beløbene.
DonationTask-klassen indeholder en konstant THRESHOLD-felt sat til 200. Denne grænse angiver det maksimale antal donationer, som en enkelt del må indeholde. Ændr ikke denne grænse.
For eksempel, hvis du starter med en liste på 1.000 donationer, skal du opdele den i dele på 200 eller færre donationer hver. Derefter beregnes det samlede beløb ved at lægge resultaterne fra hver del sammen.
THRESHOLD- threshold of array splitting;long[] listDonations- source array with all donations;int start- the beginning of the array;int end- end of the array.
Der er også en RunnableTask klasse, hvor vi kører programmet. Her initialiserer vi vores liste og eksekverer den i en ForkJoinPool. Når alt er oppe at køre, viser vi resultatet.
Hvis du implementerer compute()-metoden korrekt, bør du få det samlede beløb:
Sum: 500500
Løsningshint
I compute()-metoden skal vi kontrollere, om størrelsen på vores array (donationsliste) er mindre end den nuværende tærskel, THRESHOLD. Hvis den er mindre, er det fint; vi gennemløber blot alle elementerne i dette array (donationsliste), summerer dem og returnerer resultatet.
Hvis størrelsen er større, skal vi finde midten af arrayet og rekursivt behandle venstre og højre side af arrayet (som hvis vi deler listen mellem venner).
For at gøre dette opretter vi 2 DonationTask-objekter, videregiver arraygrænserne og selve arrayet som parametre, og kalder derefter fork()-metoden på disse objekter. Til sidst får vi sumresultatet ved at kalde join() på hver opgave, lægge resultaterne sammen og returnere det samlede beløb.
Det lyder ret kompliceret, men faktisk skal du blot forstå og implementere illustrationen ovenfor!
Jeg er sikker på, at du kan klare det! Men hvis du får problemer, kan du se løsningen.
Når du er sikker på, at alt fungerer, skal du køre verifikationstestene på stien /src/test/java/TaskForkJoinTest.java.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Can you explain how the compute() method should be structured?
What does the DonationTask class look like?
Can you give an example of how to split the array and sum the donations?
Awesome!
Completion rate improved to 3.33
Udfordring: ForkJoinPool
Stryg for at vise menuen
Opgave
Forestil dig, at du organiserer et stort velgørenhedsarrangement og skal optælle alle de donationer, der er modtaget. Du har en liste over donationsbeløb og ønsker at finde ud af den samlede sum af alle donationer. For at gøre denne opgave mere overskuelig beslutter du at opdele listen i mindre dele og fordele disse dele blandt dine venner for at hjælpe med optællingen. Hver ven beregner det samlede beløb for deres tildelte del og rapporterer resultatet tilbage til dig. Du kombinerer derefter alle disse resultater for at få det endelige totalbeløb.
Du har en DonationTask klasse, der udvider RecursiveTask<Long>. Du skal overskrive compute()-metoden i denne klasse for at implementere logikken til opdeling af donationslisten og beregning af beløbene.
DonationTask-klassen indeholder en konstant THRESHOLD-felt sat til 200. Denne grænse angiver det maksimale antal donationer, som en enkelt del må indeholde. Ændr ikke denne grænse.
For eksempel, hvis du starter med en liste på 1.000 donationer, skal du opdele den i dele på 200 eller færre donationer hver. Derefter beregnes det samlede beløb ved at lægge resultaterne fra hver del sammen.
THRESHOLD- threshold of array splitting;long[] listDonations- source array with all donations;int start- the beginning of the array;int end- end of the array.
Der er også en RunnableTask klasse, hvor vi kører programmet. Her initialiserer vi vores liste og eksekverer den i en ForkJoinPool. Når alt er oppe at køre, viser vi resultatet.
Hvis du implementerer compute()-metoden korrekt, bør du få det samlede beløb:
Sum: 500500
Løsningshint
I compute()-metoden skal vi kontrollere, om størrelsen på vores array (donationsliste) er mindre end den nuværende tærskel, THRESHOLD. Hvis den er mindre, er det fint; vi gennemløber blot alle elementerne i dette array (donationsliste), summerer dem og returnerer resultatet.
Hvis størrelsen er større, skal vi finde midten af arrayet og rekursivt behandle venstre og højre side af arrayet (som hvis vi deler listen mellem venner).
For at gøre dette opretter vi 2 DonationTask-objekter, videregiver arraygrænserne og selve arrayet som parametre, og kalder derefter fork()-metoden på disse objekter. Til sidst får vi sumresultatet ved at kalde join() på hver opgave, lægge resultaterne sammen og returnere det samlede beløb.
Det lyder ret kompliceret, men faktisk skal du blot forstå og implementere illustrationen ovenfor!
Jeg er sikker på, at du kan klare det! Men hvis du får problemer, kan du se løsningen.
Når du er sikker på, at alt fungerer, skal du køre verifikationstestene på stien /src/test/java/TaskForkJoinTest.java.
Tak for dine kommentarer!