Buscar

Aula 09

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

PROGRAMAÇÃO ORIENTADA A OBJETOS
Oswaldo Borges Peres
Aula 9 - Threads e Concorrência em Java
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. 
2
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
3
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. 
4
O trabalho síncrono
5
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.
 
6
Produtor / Consumidor
7
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 
8
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.
9
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.
10
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.
11
Pro que usar Threads em Java
À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!
12
Bibliografia
Java: como programar - 8ª edição
Deitel, Paul J.; Deitel, Harvey M.
13

Teste o Premium para desbloquear

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

Continue navegando