Utfordring: Forkjoinpool
Oppgave
Tenk deg at du organiserer et stort veldedighetsarrangement og må summere opp alle donasjoner som er mottatt. Du har en liste med donasjonsbeløp og ønsker å finne ut den totale summen av alle donasjoner. For å gjøre denne oppgaven mer håndterbar, bestemmer du deg for å dele listen inn i mindre deler og fordele disse delene blant dine venner for å hjelpe til med opptellingen. Hver venn beregner totalbeløpet for sin tildelte del og rapporterer resultatet tilbake til deg. Du kombinerer deretter alle disse resultatene for å få den endelige totalen.
Du har en DonationTask klasse som utvider RecursiveTask<Long>. Du må overstyre compute()-metoden i denne klassen for å implementere logikken for deling av donasjonslisten og beregning av beløpene.
DonationTask-klassen inkluderer en konstant THRESHOLD-felt satt til 200. Denne terskelen angir maksimalt antall donasjoner som en enkelt del skal inneholde. Ikke endre denne terskelen.
For eksempel, hvis du starter med en liste på 1,000 donasjoner, bør du dele den opp i deler på 200 eller færre donasjoner hver. Deretter beregner du totalbeløpet ved å summere resultatene fra hver del.
THRESHOLD- terskel for oppdeling av array;long[] listDonations- kildearray med alle donasjoner;int start- begynnelsen av arrayet;int end- slutten av arrayet.
Det finnes også en klasse RunnableTask hvor vi kjører programmet. Her initialiserer vi listen vår og kjører den i en ForkJoinPool. Når alt er satt opp og kjører, viser vi resultatet.
Hvis du implementerer metoden compute() riktig, skal du få totalbeløpet:
Sum: 500500
Løsningshint
I metoden compute() må vi sjekke om størrelsen på arrayet vårt (donasjonslisten) er mindre enn den nåværende terskelen, THRESHOLD. Hvis den er mindre, er det flott; vi går ganske enkelt gjennom alle elementene i dette arrayet (donasjonslisten), summerer dem, og returnerer resultatet.
Hvis størrelsen er større, må vi finne midten av arrayet og rekursivt behandle venstre og høyre side av arrayet (som om vi deler listen mellom venner).
For å gjøre dette oppretter vi 2 DonationTask-objekter, sender array-grensene og selve arrayet som parametere, og kaller deretter metoden fork() på disse objektene. Til slutt får vi sum-resultatet ved å kalle join() på hver oppgave, legge sammen resultatene, og returnere totalen.
Det høres ganske komplisert ut, men du trenger faktisk bare å forstå og implementere illustrasjonen ovenfor!
Jeg er sikker på at du klarer det! Men hvis du får problemer, kan du se på løsningen.
Når du er sikker på at alt fungerer, kjør verifikasjonstestene på stien /src/test/java/TaskForkJoinTest.java.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 3.33
Utfordring: Forkjoinpool
Sveip for å vise menyen
Oppgave
Tenk deg at du organiserer et stort veldedighetsarrangement og må summere opp alle donasjoner som er mottatt. Du har en liste med donasjonsbeløp og ønsker å finne ut den totale summen av alle donasjoner. For å gjøre denne oppgaven mer håndterbar, bestemmer du deg for å dele listen inn i mindre deler og fordele disse delene blant dine venner for å hjelpe til med opptellingen. Hver venn beregner totalbeløpet for sin tildelte del og rapporterer resultatet tilbake til deg. Du kombinerer deretter alle disse resultatene for å få den endelige totalen.
Du har en DonationTask klasse som utvider RecursiveTask<Long>. Du må overstyre compute()-metoden i denne klassen for å implementere logikken for deling av donasjonslisten og beregning av beløpene.
DonationTask-klassen inkluderer en konstant THRESHOLD-felt satt til 200. Denne terskelen angir maksimalt antall donasjoner som en enkelt del skal inneholde. Ikke endre denne terskelen.
For eksempel, hvis du starter med en liste på 1,000 donasjoner, bør du dele den opp i deler på 200 eller færre donasjoner hver. Deretter beregner du totalbeløpet ved å summere resultatene fra hver del.
THRESHOLD- terskel for oppdeling av array;long[] listDonations- kildearray med alle donasjoner;int start- begynnelsen av arrayet;int end- slutten av arrayet.
Det finnes også en klasse RunnableTask hvor vi kjører programmet. Her initialiserer vi listen vår og kjører den i en ForkJoinPool. Når alt er satt opp og kjører, viser vi resultatet.
Hvis du implementerer metoden compute() riktig, skal du få totalbeløpet:
Sum: 500500
Løsningshint
I metoden compute() må vi sjekke om størrelsen på arrayet vårt (donasjonslisten) er mindre enn den nåværende terskelen, THRESHOLD. Hvis den er mindre, er det flott; vi går ganske enkelt gjennom alle elementene i dette arrayet (donasjonslisten), summerer dem, og returnerer resultatet.
Hvis størrelsen er større, må vi finne midten av arrayet og rekursivt behandle venstre og høyre side av arrayet (som om vi deler listen mellom venner).
For å gjøre dette oppretter vi 2 DonationTask-objekter, sender array-grensene og selve arrayet som parametere, og kaller deretter metoden fork() på disse objektene. Til slutt får vi sum-resultatet ved å kalle join() på hver oppgave, legge sammen resultatene, og returnere totalen.
Det høres ganske komplisert ut, men du trenger faktisk bare å forstå og implementere illustrasjonen ovenfor!
Jeg er sikker på at du klarer det! Men hvis du får problemer, kan du se på løsningen.
Når du er sikker på at alt fungerer, kjør verifikasjonstestene på stien /src/test/java/TaskForkJoinTest.java.
Takk for tilbakemeldingene dine!