Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda API de Stream Paralelo | Coleções Sincronizadas
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Multithreading em Java

bookAPI de Stream Paralelo

Você provavelmente já está familiarizado com a Stream API, seus métodos e como ela funciona (Se não estiver, estude este tópico e depois retorne a este capítulo).

Um fluxo de dados comum não é paralelo, ou seja, por mais conveniente e elegante que seja no código, utilizar a Stream API sem o método parallelStream(), com uma grande quantidade de dados, pode impactar significativamente o desempenho.

Existe também o método parallel() que pode ser utilizado após a conversão para stream.

List<Integer> result = list.stream().parallel()
                .map(num -> ++num)
                .toList();

A diferença é que parallelStream() cria um fluxo paralelo diretamente a partir da coleção, enquanto parallel() converte um fluxo serial existente em um fluxo paralelo.

Note
Nota

E, acima de tudo, nós, como programadores, não precisamos fazer nada além de trocar o método stream() por parallelStream(). A Stream API faz todo o trabalho sozinha e otimiza nosso programa!

Exemplo: Processamento de uma Lista de Números

Suponha que temos uma lista de números e queremos encontrar a soma dos quadrados de todos os números na lista.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627
package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of integers List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Sequential stream to sum the squares of numbers int sumSequential = numbers.stream() // Create a sequential stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the sequential sum System.out.println("Sum of squares (sequential): " + sumSequential); // Parallel stream to sum the squares of numbers int sumParallel = numbers.parallelStream() // Create a parallel stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the parallel sum System.out.println("Sum of squares (parallel): " + sumParallel); } }

Como pode ser visto, apenas substituímos stream() por parallelStream() E SÓ ISSO. Neste exemplo, não haverá ganho, pois em um ambiente de thread única, um array de 10 caracteres será executado mais rapidamente. Isso ocorre porque a implementação da Stream API realiza diversas ações para distribuir a tarefa entre as threads.

Note
Nota

Stream API também decide automaticamente quantas threads utilizará para essa tarefa, buscando ser o mais eficiente possível.

Como Funciona Internamente:

1. Criação de um stream paralelo: Ao chamar parallelStream(), o Java cria um stream paralelo com base na fonte de dados original;

2. Uso do ForkJoinPool (será explorado posteriormente): Streams paralelos utilizam um pool de threads comum, ForkJoinPool.commonPool(), que gerencia um grupo de threads de trabalho;

3. Divisão: Os dados em uma thread paralela são divididos em partes usando a interface Spliterator;

4. Processamento: Cada thread de trabalho no ForkJoinPool processa sua parte dos dados;

5. Junção: Após o processamento dos dados, as threads de trabalho unem os resultados.

Vantagens dos Streams Paralelos

Aumento de desempenho é um dos principais benefícios das threads paralelas, pois permitem a distribuição de tarefas entre múltiplas threads, resultando em processamento mais rápido em processadores multi-core.

Além disso, a facilidade de uso da API de threads paralelas torna simples a integração ao código existente, eliminando a necessidade de gerenciamento complexo de threads.

Adicionalmente, a escalabilidade é uma vantagem significativa, já que as threads paralelas se ajustam automaticamente ao número de núcleos de processador disponíveis, otimizando a execução das tarefas de forma eficiente.

1. Qual classe é utilizada por threads paralelas para controlar threads?

2. Qual método é utilizado para criar um stream paralelo?

3. O que a interface Spliterator faz no contexto de streams paralelos?

question mark

Qual classe é utilizada por threads paralelas para controlar threads?

Select the correct answer

question mark

Qual método é utilizado para criar um stream paralelo?

Select the correct answer

question mark

O que a interface Spliterator faz no contexto de streams paralelos?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 2

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 when it's best to use parallel streams versus regular streams?

What are some potential drawbacks or risks of using parallel streams?

Can you provide more examples of using parallel streams in Java?

bookAPI de Stream Paralelo

Deslize para mostrar o menu

Você provavelmente já está familiarizado com a Stream API, seus métodos e como ela funciona (Se não estiver, estude este tópico e depois retorne a este capítulo).

Um fluxo de dados comum não é paralelo, ou seja, por mais conveniente e elegante que seja no código, utilizar a Stream API sem o método parallelStream(), com uma grande quantidade de dados, pode impactar significativamente o desempenho.

Existe também o método parallel() que pode ser utilizado após a conversão para stream.

List<Integer> result = list.stream().parallel()
                .map(num -> ++num)
                .toList();

A diferença é que parallelStream() cria um fluxo paralelo diretamente a partir da coleção, enquanto parallel() converte um fluxo serial existente em um fluxo paralelo.

Note
Nota

E, acima de tudo, nós, como programadores, não precisamos fazer nada além de trocar o método stream() por parallelStream(). A Stream API faz todo o trabalho sozinha e otimiza nosso programa!

Exemplo: Processamento de uma Lista de Números

Suponha que temos uma lista de números e queremos encontrar a soma dos quadrados de todos os números na lista.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627
package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of integers List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Sequential stream to sum the squares of numbers int sumSequential = numbers.stream() // Create a sequential stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the sequential sum System.out.println("Sum of squares (sequential): " + sumSequential); // Parallel stream to sum the squares of numbers int sumParallel = numbers.parallelStream() // Create a parallel stream from the list .mapToInt(n -> n * n) // Map each number to its square .sum(); // Sum the squares // Print the result of the parallel sum System.out.println("Sum of squares (parallel): " + sumParallel); } }

Como pode ser visto, apenas substituímos stream() por parallelStream() E SÓ ISSO. Neste exemplo, não haverá ganho, pois em um ambiente de thread única, um array de 10 caracteres será executado mais rapidamente. Isso ocorre porque a implementação da Stream API realiza diversas ações para distribuir a tarefa entre as threads.

Note
Nota

Stream API também decide automaticamente quantas threads utilizará para essa tarefa, buscando ser o mais eficiente possível.

Como Funciona Internamente:

1. Criação de um stream paralelo: Ao chamar parallelStream(), o Java cria um stream paralelo com base na fonte de dados original;

2. Uso do ForkJoinPool (será explorado posteriormente): Streams paralelos utilizam um pool de threads comum, ForkJoinPool.commonPool(), que gerencia um grupo de threads de trabalho;

3. Divisão: Os dados em uma thread paralela são divididos em partes usando a interface Spliterator;

4. Processamento: Cada thread de trabalho no ForkJoinPool processa sua parte dos dados;

5. Junção: Após o processamento dos dados, as threads de trabalho unem os resultados.

Vantagens dos Streams Paralelos

Aumento de desempenho é um dos principais benefícios das threads paralelas, pois permitem a distribuição de tarefas entre múltiplas threads, resultando em processamento mais rápido em processadores multi-core.

Além disso, a facilidade de uso da API de threads paralelas torna simples a integração ao código existente, eliminando a necessidade de gerenciamento complexo de threads.

Adicionalmente, a escalabilidade é uma vantagem significativa, já que as threads paralelas se ajustam automaticamente ao número de núcleos de processador disponíveis, otimizando a execução das tarefas de forma eficiente.

1. Qual classe é utilizada por threads paralelas para controlar threads?

2. Qual método é utilizado para criar um stream paralelo?

3. O que a interface Spliterator faz no contexto de streams paralelos?

question mark

Qual classe é utilizada por threads paralelas para controlar threads?

Select the correct answer

question mark

Qual método é utilizado para criar um stream paralelo?

Select the correct answer

question mark

O que a interface Spliterator faz no contexto de streams paralelos?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 2
some-alt