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
Practice
Projects
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

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?

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