Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Sfida: Forkjoinpool | Migliori Pratiche per il Multithreading
Multithreading in Java

bookSfida: Forkjoinpool

Compito

Immagina di organizzare un grande evento di beneficenza e di dover conteggiare tutte le donazioni ricevute. Hai un elenco di importi donati e vuoi conoscere la somma totale di tutte le donazioni. Per rendere questo compito più gestibile, decidi di dividere l'elenco in parti più piccole e di distribuire questi segmenti tra i tuoi amici per aiutarti nel conteggio. Ogni amico calcola l'importo totale per la propria parte assegnata e ti comunica il risultato. Successivamente, combini tutti questi risultati per ottenere il totale finale.

Hai una classe DonationTask che estende RecursiveTask<Long>. Devi sovrascrivere il metodo compute() in questa classe per implementare la logica di suddivisione dell'elenco delle donazioni e calcolo degli importi.

La classe DonationTask include un campo costante THRESHOLD impostato a 200. Questa soglia specifica il numero massimo di donazioni che un singolo segmento dovrebbe contenere. Non modificare questa soglia.

Ad esempio, se inizi con un elenco di 1.000 donazioni, dovresti suddividerlo in segmenti da 200 o meno donazioni ciascuno. Poi, calcola l'importo totale sommando i risultati di ciascun segmento.

  • THRESHOLD - soglia per la suddivisione dell'array;
  • long[] listDonations - array sorgente con tutte le donazioni;
  • int start - inizio dell'array;
  • int end - fine dell'array.

Esiste anche una classe RunnableTask dove viene eseguito il programma. Qui inizializziamo la nostra lista ed eseguiamo il tutto in un ForkJoinPool. Una volta che tutto è operativo, visualizziamo il risultato.

Se si implementa correttamente il metodo compute(), si dovrebbe ottenere la somma totale:

Sum: 500500 

Suggerimenti per la soluzione

Nel metodo compute(), è necessario verificare se la dimensione del nostro array (donation list) è inferiore alla soglia corrente, THRESHOLD. Se è inferiore, ottimo; si cicla semplicemente su tutti gli elementi di questo array (donation list), si sommano e si restituisce il risultato.

Se la dimensione è maggiore, bisogna trovare la metà dell'array e processare ricorsivamente i lati sinistro e destro dell'array (come se si stesse dividendo la lista tra amici).

Per fare ciò, si creano 2 oggetti DonationTask, si passano i limiti dell'array e l'array stesso come parametri, quindi si richiama il metodo fork() su questi oggetti. Infine, si ottiene il risultato della somma richiamando join() su ciascun task, si sommano i risultati e si restituisce il totale.

Note
Nota

Sembra piuttosto complicato, ma in realtà basta comprendere e implementare l'illustrazione sopra!

Sono sicuro che puoi farcela! Ma se hai difficoltà, puoi consultare la soluzione.

Una volta che sei sicuro che tutto funzioni, esegui i test di verifica nel percorso /src/test/java/TaskForkJoinTest.java.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

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

bookSfida: Forkjoinpool

Scorri per mostrare il menu

Compito

Immagina di organizzare un grande evento di beneficenza e di dover conteggiare tutte le donazioni ricevute. Hai un elenco di importi donati e vuoi conoscere la somma totale di tutte le donazioni. Per rendere questo compito più gestibile, decidi di dividere l'elenco in parti più piccole e di distribuire questi segmenti tra i tuoi amici per aiutarti nel conteggio. Ogni amico calcola l'importo totale per la propria parte assegnata e ti comunica il risultato. Successivamente, combini tutti questi risultati per ottenere il totale finale.

Hai una classe DonationTask che estende RecursiveTask<Long>. Devi sovrascrivere il metodo compute() in questa classe per implementare la logica di suddivisione dell'elenco delle donazioni e calcolo degli importi.

La classe DonationTask include un campo costante THRESHOLD impostato a 200. Questa soglia specifica il numero massimo di donazioni che un singolo segmento dovrebbe contenere. Non modificare questa soglia.

Ad esempio, se inizi con un elenco di 1.000 donazioni, dovresti suddividerlo in segmenti da 200 o meno donazioni ciascuno. Poi, calcola l'importo totale sommando i risultati di ciascun segmento.

  • THRESHOLD - soglia per la suddivisione dell'array;
  • long[] listDonations - array sorgente con tutte le donazioni;
  • int start - inizio dell'array;
  • int end - fine dell'array.

Esiste anche una classe RunnableTask dove viene eseguito il programma. Qui inizializziamo la nostra lista ed eseguiamo il tutto in un ForkJoinPool. Una volta che tutto è operativo, visualizziamo il risultato.

Se si implementa correttamente il metodo compute(), si dovrebbe ottenere la somma totale:

Sum: 500500 

Suggerimenti per la soluzione

Nel metodo compute(), è necessario verificare se la dimensione del nostro array (donation list) è inferiore alla soglia corrente, THRESHOLD. Se è inferiore, ottimo; si cicla semplicemente su tutti gli elementi di questo array (donation list), si sommano e si restituisce il risultato.

Se la dimensione è maggiore, bisogna trovare la metà dell'array e processare ricorsivamente i lati sinistro e destro dell'array (come se si stesse dividendo la lista tra amici).

Per fare ciò, si creano 2 oggetti DonationTask, si passano i limiti dell'array e l'array stesso come parametri, quindi si richiama il metodo fork() su questi oggetti. Infine, si ottiene il risultato della somma richiamando join() su ciascun task, si sommano i risultati e si restituisce il totale.

Note
Nota

Sembra piuttosto complicato, ma in realtà basta comprendere e implementare l'illustrazione sopra!

Sono sicuro che puoi farcela! Ma se hai difficoltà, puoi consultare la soluzione.

Una volta che sei sicuro che tutto funzioni, esegui i test di verifica nel percorso /src/test/java/TaskForkJoinTest.java.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 3
some-alt