Desafio: Forkjoinpool
Tarefa
Imagine que você está organizando um grande evento beneficente e precisa somar todas as doações recebidas. Você possui uma lista com os valores das doações e deseja descobrir o total geral de todas elas. Para tornar essa tarefa mais gerenciável, você decide dividir a lista em partes menores e distribuir esses segmentos entre seus amigos para ajudar na contagem. Cada amigo calcula o valor total de seu segmento atribuído e informa o resultado para você. Em seguida, você combina todos esses resultados para obter o total final.
Você possui uma classe DonationTask que estende RecursiveTask<Long>. É necessário sobrescrever o método compute() nesta classe para implementar a lógica de divisão da lista de doações e cálculo dos valores.
A classe DonationTask inclui um campo constante THRESHOLD definido como 200. Esse limite especifica o número máximo de doações que um único segmento deve conter. Não altere esse limite.
Por exemplo, se você começar com uma lista de 1.000 doações, deve dividi-la em segmentos de 200 ou menos doações cada. Depois, calcule o valor total somando os 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.
Existe também uma classe RunnableTask onde o programa é executado. É aqui que a lista é inicializada e executada em um ForkJoinPool. Após tudo estar em funcionamento, o resultado é exibido.
Se o método compute() for implementado corretamente, o valor total será:
Sum: 500500
Dicas de Solução
No método compute(), é necessário verificar se o tamanho do array (lista de doações) é menor que o limite atual, THRESHOLD. Se for menor, basta percorrer todos os elementos desse array (lista de doações), somá-los e retornar o resultado.
Se o tamanho for maior, é preciso encontrar o meio do array e processar recursivamente os lados esquerdo e direito do array (como se a lista fosse dividida entre amigos).
Para isso, crie 2 objetos DonationTask, passe os limites do array e o próprio array como parâmetros, e então chame o método fork() nesses objetos. Por fim, obtenha o resultado da soma chamando join() em cada tarefa, some os resultados e retorne o total.
Parece bastante complicado, mas na verdade você só precisa compreender e implementar a ilustração acima!
Tenho certeza de que você consegue! Mas se tiver dificuldades, pode consultar a solução.
Quando tiver certeza de que tudo está funcionando, execute os testes de verificação no caminho /src/test/java/TaskForkJoinTest.java.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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?
Incrível!
Completion taxa melhorada para 3.33
Desafio: Forkjoinpool
Deslize para mostrar o menu
Tarefa
Imagine que você está organizando um grande evento beneficente e precisa somar todas as doações recebidas. Você possui uma lista com os valores das doações e deseja descobrir o total geral de todas elas. Para tornar essa tarefa mais gerenciável, você decide dividir a lista em partes menores e distribuir esses segmentos entre seus amigos para ajudar na contagem. Cada amigo calcula o valor total de seu segmento atribuído e informa o resultado para você. Em seguida, você combina todos esses resultados para obter o total final.
Você possui uma classe DonationTask que estende RecursiveTask<Long>. É necessário sobrescrever o método compute() nesta classe para implementar a lógica de divisão da lista de doações e cálculo dos valores.
A classe DonationTask inclui um campo constante THRESHOLD definido como 200. Esse limite especifica o número máximo de doações que um único segmento deve conter. Não altere esse limite.
Por exemplo, se você começar com uma lista de 1.000 doações, deve dividi-la em segmentos de 200 ou menos doações cada. Depois, calcule o valor total somando os 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.
Existe também uma classe RunnableTask onde o programa é executado. É aqui que a lista é inicializada e executada em um ForkJoinPool. Após tudo estar em funcionamento, o resultado é exibido.
Se o método compute() for implementado corretamente, o valor total será:
Sum: 500500
Dicas de Solução
No método compute(), é necessário verificar se o tamanho do array (lista de doações) é menor que o limite atual, THRESHOLD. Se for menor, basta percorrer todos os elementos desse array (lista de doações), somá-los e retornar o resultado.
Se o tamanho for maior, é preciso encontrar o meio do array e processar recursivamente os lados esquerdo e direito do array (como se a lista fosse dividida entre amigos).
Para isso, crie 2 objetos DonationTask, passe os limites do array e o próprio array como parâmetros, e então chame o método fork() nesses objetos. Por fim, obtenha o resultado da soma chamando join() em cada tarefa, some os resultados e retorne o total.
Parece bastante complicado, mas na verdade você só precisa compreender e implementar a ilustração acima!
Tenho certeza de que você consegue! Mas se tiver dificuldades, pode consultar a solução.
Quando tiver certeza de que tudo está funcionando, execute os testes de verificação no caminho /src/test/java/TaskForkJoinTest.java.
Obrigado pelo seu feedback!