Buscar

Threads e Concorrência em Java

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

PROGRAMAÇÃO ORIENTADA A OBJETOS
Aula 9- Threads e Concorrência em Java
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Conteúdo Programático desta aula
 Aplicar os conceitos e threads, processos concorrentes e sincronização em pequenos programas.
 Aplicar e verificar os conceitos de prioridade de execução de cada uma dos threads.
 Criar e executar um aplicativo de múltiplos threads.
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Sincronização
Durante a execução de threads, há casos em que elas trabalham independentemente uma da outra, sem necessidade de qualquer comunicação entre elas. Por outro lado, há casos em que elas comunicam-se de alguma forma ou utilizam dados em comum. Este comportamento gera a necessidade de denominar os threads em assíncronas e síncronas, dependendo da forma de trabalho desempenhada. Threads que trabalham independentes no tempo, são assíncronas enquanto aquelas que trocam informações em tempo de execução são síncronas.
As threads se diferem dos processos por poderem ter áreas de dados comuns. Isto pode facilitar em muito a implementação de programas. Porém, pode causar alguns erros quando a mesma base de dados é alterada por mais de um thread, em momentos inesperados. 
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Sincronização
O uso de memória compartilhada entre os threads obriga o programador a sincronizar as ações de suas threads.
Para isso, Java provê monitores ou locks. Imagine um lock como uma permissão para que apenas um thread possa utilizar um recurso por vez.
Cada objeto em Java possui um lock e ele deve ser obtido através do comando synchronized.
 
Os métodos wait(), notify() e notifyAll() também são muito importantes na sincronização, sendo responsáveis por provocar, respectivamente: uma espera, a liberação de uma ou mais threads em espera
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Motivação para Concorrência
Na maioria dos programas que desenvolvemos, criamos programas que na maioria dos casos os processos são assíncronos e quando há alguma complexidade na execução das tarefas, delegamos este processo para a JVM. Ela é a responsável por criar e distribuir os threads do nosso sistema.
Mas quando desenvolvemos determinados tipos de aplicativos, onde fica claro que existem uma fonte de recursos e algum outro programa que precisa destes recursos para executar ou gravar algo. Como exemplo, podemos citar a migração de dados de um sistema para outro. Precisamos ler os dados, processar estes dados e, quando estiverem prontos, guardar os dados no novo sistema. 
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
O trabalho síncrono
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor
Thread Produtor produz um determinado dado, que é disponibilizado em uma área comum. 
Thread Consumidor deverá buscar nesta área compartilhada o dado produzido. Com isso, cada Thread faz uma parte do trabalho e outra faz a outra.
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor sem Sincronização
Código do Produtor:
Este código guarda a área compartilhada no atributo compartilhado. Na execução, é simulado uma carga de trabalho onde em cada iteração do laço, o produtor precisa dormir um tempo aleatório entre 0 e 3 segundos. Esta simulação pode emular uma consulta no banco, uma leitura de arquivo, um acesso a um dado remoto ou até mesmo uma entrada de dados do dispositivo padrão de entrada. 
Quando o thread acorda, ele coloca na área compartilhada o dado produzido.
Neste caso, estaremos produzindo os números de 1 até 10. 
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor sem Sincronização
Código do Consumidor:
Neste código abaixo, faremos um laço para consumir todos os dados produzidos até encontrarmos o último elemento. Como sabemos que o último elemento é o número 10, este laço terá esta regra de parada. Também estaremos simulando uma carga de trabalho no consumidor, que está no momento que colocamos a thread para dormir um espaço de tempo aleatório entre 0 e 3 segundos. A ideia é somar todos os elementos produzidos e guardar este valor em SOMA. Ao terminar, será apresentado o resultado do processamento.
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor sem Sincronização
Código do Consumidor:
Neste código abaixo, faremos um laço para consumir todos os dados produzidos até encontrarmos o último elemento. Como sabemos que o último elemento é o número 10, este laço terá esta regra de parada. Também estaremos simulando uma carga de trabalho no consumidor, que está no momento que colocamos a thread para dormir um espaço de tempo aleatório entre 0 e 3 segundos. A ideia é somar todos os elementos produzidos e guardar este valor em SOMA. Ao terminar, será apresentado o resultado do processamento.
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor sem Sincronização
Código do Consumidor:
Neste código abaixo, faremos um laço para consumir todos os dados produzidos até encontrarmos o último elemento. Como sabemos que o último elemento é o número 10, este laço terá esta regra de parada. Também estaremos simulando uma carga de trabalho no consumidor, que está no momento que colocamos a thread para dormir um espaço de tempo aleatório entre 0 e 3 segundos. A ideia é somar todos os elementos produzidos e guardar este valor em SOMA. Ao terminar, será apresentado o resultado do processamento.
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor sem Sincronização
Código do Classe de compartilhamento de conteúdo:
Neste objeto, que será compartilhado entre o consumidor e produtor, é dada a troca de informação. É criado um atributo que será usado para colocar a informação – PRODUTOR e ler a informação - CONSUMIDOR 
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor sem Sincronização
O resultado não é o que se deseja: o consumidor deve receber cada número exatamente uma vez. 
Este problema se chama uma condição de corrida
Uma condição de corrida é uma situação em que 2 ou mais threads ou processos estão compartilhando dados (lendo ou gravando) e o resultado final depende do tempo do escalonamento dos threads
Condições de corrida levam a resultados imprevisíveis e a bugs sutis, difíceis de achar. Um bug é fácil de remover se for reproduzível; quando não o é, o mundo se torna cruel.
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Produtor / Consumidor com Sincronização
Quando efetuamos a sincronização, os dados só serão consumidos após serem produzidos. Isto se dá porque se não for a vez do thread de trabalhar, ele entrará em espera sendo notificado quando o recurso estiver disponível.
Código do Consumidor: Sem alteração
Código do Produtor: Sem Alteração
Para a sincronização, basta criar uma classe para que a área compartilhada seja sincronizada e faça o controle. 
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
Pro que usar Threads em Java
Existem várias aplicações e usos para os threads. Se a sua aplicação Java for um servidor, como um servidor web por exemplo, você deve estar atendendo a mais de um cliente ao mesmo tempo. Com isso,
é possível que você queira uma thread por cliente. 
Uma aplicação interativa pode precisar executar algo que demora um certo tempo enquanto a interface com o usuário é apresentada em outra thread para avisar que o processador está trabalhando.
Às vezes encontramos em nossos programas a execução de trechos independentes, que poderiam ser executados em paralelo. Neste caso, é apropriado cria uma thread para cada parte e executar todas de uma vez, visto que a ordem entre elas não altera o resultado final do meu sistema.
Outro aspecto relevante é que cada vez mais, os processadores estão mais rápidos e com um número maior de núcleos. Cada núcleo é capaz de executar uma thread em paralelo. O grande desafio que temos hoje em dia é conseguir paralelizar nossos processos para utilizar todos os recursos de hardware disponíveis!
Tema da Apresentação
THREADS E CONCORRÊNCIA EM JAVA – AULA 9
PROGRAMAÇÃO ORIENTADA A OBJETOS
FIM
Tema da Apresentação

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando