Baixe o app para aproveitar ainda mais
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
Compartilhar