Buscar

Threads e Concorrência em Java

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 16 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 16 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 16 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

PROGRAMAÇÃO ORIENTADA A OBJETOS
Oswaldo Borges Peres
Aula 8 - Threads e Concorrência
Processos
O processamento de hoje ainda é feito na maioria das vezes por um único processador da máquina. Só que na maioria dos sistemas, vários processos são executados no mesmo intervalo de tempo, dando a impressão de simultaneidade de execução. Esta capacidade é chamada de multiprocessamento, e muito estudada em sistemas operacionais. 
Um processo é basicamente um programa em execução. Eles são independentes dos outros.
2
Processos - mais de um núcleo
3
Threads
São subprocessos no Sistema Operacional. O thread pode ser vista como uma parte de um processo, que permite compartilhar a sua área de dados com o programa ou outros threads. Seu início de execução é muito mais rápido do que um processo, e o acesso a sua área de dados funciona como um único programa.
4
Os estados de uma Thread
A execução de uma thread pode passar por quatro estados: novo, executável, bloqueado e encerrado. 
5
Thread em Java
Cada Thread está associada com uma instância da classe Thread. 
A máquina virtual Java permite que uma aplicação tenha diversos fluxos sequencias de execução rodando concorrentemente . Para se utilizar esta funcionalidade, a API Java disponibiliza a classe Thread e a interface Runnable.
A Interface Runnable: define um único método – run – que deve conter o código de execução da thread.
A Classe Thread: Implementa o Runnable, logo seu método run nada faz. Uma aplicação pode herdar de thread fornecendo a sua própria implementação do método run.
6
Observe que em ambos os exemplos o método Thread.start é chamado para iniciar a thread.
Qual devo Usar
Segundo a Sun, “a linguagem de programação Java não permite herança múltipla”, no entanto há uma alternativa para o uso de mais de uma superclasse, que é a utilização de interfaces. Com base neste conceito, desde a API 6.2 existe a interface Runnable, que possui um funcionamento bem semelhante ao da classe Thread, ao exigir a implementação do método run().
É mais comum utilizar a Interface Runnable, pois este objeto pode herdar comportamentos de outra classe, que não a Thread. O segundo exemplo pode ser usado em aplicações mais simples, pois é limitada pelo fato de que a classe precisa ser herdada de Thread. 
7
Principais Métodos da classe Thread
run()
 É neste método que definimos o que o thread vai executar. Por esta razão, deve estar presente em todas as threads.
start()
 Destinado a ativar a thread, e a thread passa a um estado RUNNANLE , ou seja, registra a thread no thread scheduler.
getPriority()/setPriority()
Retorna ou configura a prioridade de uma thread.
8
Principais Métodos da classe Thread
yield()
Cede o processamento para outra thread. Isto ocorre porque este método faz com que a thread corrente pause, possibilitando que outra thread seja despachada.
sleep()
Faz com que a thread fique em estado de espera uma quantidade mínima de tempo, em milisegundos, possibilitando a CPU executar outras threads.
join()
Condiciona a continuação da execução de uma thread ao término de uma outra.
9
Principais Métodos da classe Thread
wait()
Utilizado para sincronizar acesso a um objeto. Coloca a thread corrente em estado de espera até que outra thread chame os métodos notify ou notifyAll liberando o objeto.
notify()
Acorda a thread que, voluntariamente, estava esperando a liberação de um objeto.
notifyAll()
Acorda todas as threads que estavam esperando a liberação de um objeto.
10
Prioridades nas Threads
A prioridade de um thread corresponde a preferência que ela terá perante as demais durante sua execução. Quanto maior a prioridade de um thread, maior será sua preferência no uso da CPU. Threads de mesma prioridade costumam partilhar o tempo de CPU igualmente. 
A prioridade é extremamente ligada ao algoritmo de escalonamento de CPU que o sistema operacional utiliza. Para definir a prioridade de um thread, são usados números de 1 a 10, sendo que o número 5 é usado para definir a prioridade como normal. Quanto maior o valor da prioridade, maior é a sua prioridade. Entretanto, nem todos os sistemas operacionais possuem as mesmas prioridades de um thread Java. Portanto, para garantir que um thread com prioridade 10 tenha prioridade alta tanto em um sistema operacional cuja prioridade máxima seja 10 quanto em outro que seja 100, a JVM traduz a prioridade especificada no código para a do sistema operacional, logo uma prioridade 10 em Java pode ser traduzida para uma prioridade 100, por exemplo.
11
Prioridades nas Threads
Para definirmos a prioridade da thread, usamos os métodos:
void setPriority(int prioridade) – Define a prioridade de execução de uma thread. Os valores de prioridade estão entre 1 e 10; 
int getPriority() – verifica a prioridade de execução de uma thread; 
12
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. 
13
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
14
Passo a Passo
Vamos criar um programa para criar threads e coloca-las para dormir com um tempo aleatório entre 0 e 5 segundos. Vamos monitorar seu funcionamento, quer dizer, ao criarmos os threads, informaremos quanto tempo cada uma irá dormir. Ao acordar, cada uma deve sinalizar que acordou e terminar.
Observe que as quatro threads foram criadas na ordem, com tempos de sono diferentes. A saída da execução de cada thread já tira da ordem normal, visto que foi dada pelo escalonador.
Mas, como o tempo dormindo é bem diferente, a thread 3, que dormiu 493 milisegundos acorda primeiro, seguindo da 1, 2 e finalmente 4. Observe também que o tempo total de execução do programa foi de 3 segundos.
15
Bibliografia
Java: como programar - 8ª edição
Deitel, Paul J.; Deitel, Harvey M.
16

Continue navegando