Desafío: ForkJoinPool
Tarea
Imagina que estás organizando un gran evento benéfico y necesitas sumar todas las donaciones recibidas. Tienes una lista de montos de donaciones y deseas averiguar la suma total de todas ellas. Para hacer esta tarea más manejable, decides dividir la lista en partes más pequeñas y distribuir estos segmentos entre tus amigos para que ayuden con el conteo. Cada amigo calcula el monto total de su segmento asignado y te informa el resultado. Luego, combinas todos estos resultados para obtener el total final.
Tienes una clase DonationTask que extiende RecursiveTask<Long>. Debes sobrescribir el método compute() en esta clase para implementar la lógica de dividir la lista de donaciones y calcular los montos.
La clase DonationTask incluye un campo constante THRESHOLD establecido en 200. Este umbral especifica el número máximo de donaciones que debe contener un solo segmento. No cambies este umbral.
Por ejemplo, si comienzas con una lista de 1,000 donaciones, debes dividirla en segmentos de 200 o menos donaciones cada uno. Luego, calcula el monto total sumando los resultados de cada segmento.
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.
También existe una clase RunnableTask donde se ejecuta el programa. Aquí es donde inicializamos nuestra lista y la ejecutamos en un ForkJoinPool. Una vez que todo está en funcionamiento, mostramos el resultado.
Si implementa correctamente el método compute(), debería obtener la cantidad total:
Sum: 500500
Pistas para la solución
En el método compute(), necesitamos comprobar si el tamaño de nuestro arreglo (lista de donaciones) es menor que el umbral actual, THRESHOLD. Si es menor, perfecto; simplemente recorremos todos los elementos de este arreglo (lista de donaciones), los sumamos y devolvemos el resultado.
Si el tamaño es mayor, entonces necesitamos encontrar el punto medio del arreglo y procesar recursivamente los lados izquierdo y derecho del arreglo (como si dividiéramos la lista entre amigos).
Para hacer esto, creamos 2 objetos DonationTask, pasamos los límites del arreglo y el propio arreglo como parámetros, luego llamamos al método fork() en estos objetos. Finalmente, obtenemos el resultado de la suma llamando a join() en cada tarea, sumando los resultados y devolviendo el total.
Parece bastante complicado, pero en realidad solo necesitas comprender e implementar la ilustración anterior.
Estoy seguro de que puedes lograrlo. Pero si tienes dificultades, puedes consultar la solución.
Una vez que verifiques que todo funciona correctamente, ejecuta las pruebas de verificación en la ruta /src/test/java/TaskForkJoinTest.java.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
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
Desafío: ForkJoinPool
Desliza para mostrar el menú
Tarea
Imagina que estás organizando un gran evento benéfico y necesitas sumar todas las donaciones recibidas. Tienes una lista de montos de donaciones y deseas averiguar la suma total de todas ellas. Para hacer esta tarea más manejable, decides dividir la lista en partes más pequeñas y distribuir estos segmentos entre tus amigos para que ayuden con el conteo. Cada amigo calcula el monto total de su segmento asignado y te informa el resultado. Luego, combinas todos estos resultados para obtener el total final.
Tienes una clase DonationTask que extiende RecursiveTask<Long>. Debes sobrescribir el método compute() en esta clase para implementar la lógica de dividir la lista de donaciones y calcular los montos.
La clase DonationTask incluye un campo constante THRESHOLD establecido en 200. Este umbral especifica el número máximo de donaciones que debe contener un solo segmento. No cambies este umbral.
Por ejemplo, si comienzas con una lista de 1,000 donaciones, debes dividirla en segmentos de 200 o menos donaciones cada uno. Luego, calcula el monto total sumando los resultados de cada segmento.
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.
También existe una clase RunnableTask donde se ejecuta el programa. Aquí es donde inicializamos nuestra lista y la ejecutamos en un ForkJoinPool. Una vez que todo está en funcionamiento, mostramos el resultado.
Si implementa correctamente el método compute(), debería obtener la cantidad total:
Sum: 500500
Pistas para la solución
En el método compute(), necesitamos comprobar si el tamaño de nuestro arreglo (lista de donaciones) es menor que el umbral actual, THRESHOLD. Si es menor, perfecto; simplemente recorremos todos los elementos de este arreglo (lista de donaciones), los sumamos y devolvemos el resultado.
Si el tamaño es mayor, entonces necesitamos encontrar el punto medio del arreglo y procesar recursivamente los lados izquierdo y derecho del arreglo (como si dividiéramos la lista entre amigos).
Para hacer esto, creamos 2 objetos DonationTask, pasamos los límites del arreglo y el propio arreglo como parámetros, luego llamamos al método fork() en estos objetos. Finalmente, obtenemos el resultado de la suma llamando a join() en cada tarea, sumando los resultados y devolviendo el total.
Parece bastante complicado, pero en realidad solo necesitas comprender e implementar la ilustración anterior.
Estoy seguro de que puedes lograrlo. Pero si tienes dificultades, puedes consultar la solución.
Una vez que verifiques que todo funciona correctamente, ejecuta las pruebas de verificación en la ruta /src/test/java/TaskForkJoinTest.java.
¡Gracias por tus comentarios!