Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Produtor-Consumidor | Melhores Práticas de Multithreading
Multithreading em Java

bookProdutor-Consumidor

Ótimo trabalho! Você percorreu um longo caminho, e exploramos bastante teoria e exemplos práticos!

Você pode ter encontrado o padrão Producer-Consumer em outras seções, mas talvez não tenha percebido. Nesta seção, vamos discuti-lo em detalhes, e se algo dos exemplos anteriores estava confuso, ficará claro nesta seção!

O padrão Producer-Consumer envolve dois tipos de threads, que são claros pelo nome: Produtor e Consumidor.

O Producer irá produzir alguns dados que serão colocados em um buffer/fila compartilhado ao qual o Consumer também tem acesso, e ele apenas consome esses dados do local de armazenamento.

Note
Nota

O principal objetivo do padrão é separar a produção e o consumo de dados, permitindo que os produtores funcionem de forma independente dos consumidores.

Onde é Utilizado

Este padrão é comumente empregado em sistemas onde é necessário processamento de dados assíncrono. Vamos explorar em detalhes o que significa asynchrony posteriormente.

Na prática, esse padrão é frequentemente utilizado em sistemas de processamento de eventos, registro de dados, tratamento de requisições de rede e processamento paralelo de dados.

Imagine uma esteira em uma fábrica onde um trabalhador coloca peças na esteira (produtor) e outro trabalhador retira e monta essas peças em um produto (consumidor). O produtor e o consumidor podem operar em velocidades diferentes, mas a esteira (buffer) ajuda a mantê-los sincronizados.

Como isso se parece no código?

Considere um exemplo de uso de BlockingQueue para implementar o padrão Producer-Consumer.

Note
Nota

É possível alternar entre as abas, e assim acessar o código necessário.

ExampleProducerConsumer.java

ExampleProducerConsumer.java

Consumer.java

Consumer.java

Producer.java

Producer.java

copy
12345678910
public class ExampleProducerConsumer { public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); // Shared queue Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); // Start producer thread consumerThread.start(); // Start consumer thread } }

Este programa demonstra o padrão Producer-Consumer utilizando BlockingQueue para garantir interações seguras entre threads.

Uma BlockingQueue é estabelecida para atuar como um buffer compartilhado para as threads Producer e Consumer.

A classe Producer gera números de 0 a 9 e os adiciona à fila, e então insere um valor sinalizador de -1 para indicar que a produção foi finalizada.

A classe Consumer recupera repetidamente números da fila. Quando encontra o valor sinalizador -1, ela cessa o consumo.

No método main, a fila compartilhada é inicializada, e as threads producer e consumer são criadas e iniciadas. O Producer adiciona itens à fila enquanto o Consumer processa esses itens.

Por que é utilizado?

O padrão Producer-Consumer é utilizado para alcançar diversos objetivos:

  • Sincronização de threads: Permite que threads troquem dados de forma segura;
  • Melhoria de desempenho: Produtores e consumidores podem trabalhar em paralelo sem bloquear uns aos outros;
  • Bufferização: O buffer ajuda a equilibrar diferenças nas velocidades de produção e consumo.
Note
Nota

O padrão Producer-Consumer auxilia na organização de uma interação segura e eficiente entre threads em programação multithread. Permite que produtores e consumidores trabalhem de forma independente utilizando um buffer para sincronização, o que melhora o desempenho e previne bloqueios.

1. Qual função a classe Producer desempenha no padrão Producer-Consumer?

2. Qual é a função do valor de sinal -1 no programa de exemplo apresentado?

question mark

Qual função a classe Producer desempenha no padrão Producer-Consumer?

Select the correct answer

question mark

Qual é a função do valor de sinal -1 no programa de exemplo apresentado?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 1

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

bookProdutor-Consumidor

Deslize para mostrar o menu

Ótimo trabalho! Você percorreu um longo caminho, e exploramos bastante teoria e exemplos práticos!

Você pode ter encontrado o padrão Producer-Consumer em outras seções, mas talvez não tenha percebido. Nesta seção, vamos discuti-lo em detalhes, e se algo dos exemplos anteriores estava confuso, ficará claro nesta seção!

O padrão Producer-Consumer envolve dois tipos de threads, que são claros pelo nome: Produtor e Consumidor.

O Producer irá produzir alguns dados que serão colocados em um buffer/fila compartilhado ao qual o Consumer também tem acesso, e ele apenas consome esses dados do local de armazenamento.

Note
Nota

O principal objetivo do padrão é separar a produção e o consumo de dados, permitindo que os produtores funcionem de forma independente dos consumidores.

Onde é Utilizado

Este padrão é comumente empregado em sistemas onde é necessário processamento de dados assíncrono. Vamos explorar em detalhes o que significa asynchrony posteriormente.

Na prática, esse padrão é frequentemente utilizado em sistemas de processamento de eventos, registro de dados, tratamento de requisições de rede e processamento paralelo de dados.

Imagine uma esteira em uma fábrica onde um trabalhador coloca peças na esteira (produtor) e outro trabalhador retira e monta essas peças em um produto (consumidor). O produtor e o consumidor podem operar em velocidades diferentes, mas a esteira (buffer) ajuda a mantê-los sincronizados.

Como isso se parece no código?

Considere um exemplo de uso de BlockingQueue para implementar o padrão Producer-Consumer.

Note
Nota

É possível alternar entre as abas, e assim acessar o código necessário.

ExampleProducerConsumer.java

ExampleProducerConsumer.java

Consumer.java

Consumer.java

Producer.java

Producer.java

copy
12345678910
public class ExampleProducerConsumer { public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); // Shared queue Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); // Start producer thread consumerThread.start(); // Start consumer thread } }

Este programa demonstra o padrão Producer-Consumer utilizando BlockingQueue para garantir interações seguras entre threads.

Uma BlockingQueue é estabelecida para atuar como um buffer compartilhado para as threads Producer e Consumer.

A classe Producer gera números de 0 a 9 e os adiciona à fila, e então insere um valor sinalizador de -1 para indicar que a produção foi finalizada.

A classe Consumer recupera repetidamente números da fila. Quando encontra o valor sinalizador -1, ela cessa o consumo.

No método main, a fila compartilhada é inicializada, e as threads producer e consumer são criadas e iniciadas. O Producer adiciona itens à fila enquanto o Consumer processa esses itens.

Por que é utilizado?

O padrão Producer-Consumer é utilizado para alcançar diversos objetivos:

  • Sincronização de threads: Permite que threads troquem dados de forma segura;
  • Melhoria de desempenho: Produtores e consumidores podem trabalhar em paralelo sem bloquear uns aos outros;
  • Bufferização: O buffer ajuda a equilibrar diferenças nas velocidades de produção e consumo.
Note
Nota

O padrão Producer-Consumer auxilia na organização de uma interação segura e eficiente entre threads em programação multithread. Permite que produtores e consumidores trabalhem de forma independente utilizando um buffer para sincronização, o que melhora o desempenho e previne bloqueios.

1. Qual função a classe Producer desempenha no padrão Producer-Consumer?

2. Qual é a função do valor de sinal -1 no programa de exemplo apresentado?

question mark

Qual função a classe Producer desempenha no padrão Producer-Consumer?

Select the correct answer

question mark

Qual é a função do valor de sinal -1 no programa de exemplo apresentado?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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