Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: Forkjoinpool | Melhores Práticas de Multithreading
Quizzes & Challenges
Quizzes
Challenges
/
Multithreading em Java

bookDesafio: 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.

Note
Nota

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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 3.33

bookDesafio: 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.

Note
Nota

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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 3
some-alt