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
Awesome!
Completion rate improved to 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!