15
PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - Threads e Concorrência

PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

  • Upload
    vulien

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

PROGRAMAÇÃO ORIENTADA A OBJETOS

Aula 11 - Threads e Concorrência

Page 2: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Conteúdo Programático desta aula

• Apresentar os Conceitos de Threads,

Concorrência e Sincronização.

• Verificar a aplicabilidade destes conceitos

no mercado, bem como sua importância.

• Desenvolver pequenos programas para

testar os conceitos apresentados.

Page 3: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

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.

Page 4: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Processos – mais de um núcleo

Page 5: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

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.

Page 6: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

As vantagens do uso das Threads

•Torna-se menos custoso em termos de processamento

criar um thread que um processo;

•São necessárias poucas variáveis para criação de um

thread;

•Podem compartilhar o mesmo espaço de processo;

•Podem compartilhar os mesmos recursos de seus

processos.

Page 7: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Os estados de uma Thread

A execução de uma thread pode passar por quatro estados: novo, executável,

bloqueado e encerrado.

Page 8: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

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 (SUN, 2009a). 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.

Observe que em ambos os exemplos o método Thread.start é

chamado para iniciar a thread.

Page 9: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Qual devo UsarSegundo 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.

Page 10: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Prioridades nas ThreadsA 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.

Page 11: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Prioridades nas ThreadsPara 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;

Page 12: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

SincronizaçãoDurante 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.

Page 13: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

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

Page 14: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

Exemplo

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.

Page 15: PROGRAMAÇÃO ORIENTADA A OBJETOS Aula 11 - lncc.brrogerio/poo/11 - Threads e Concorrencia.pdf · THREADS E CONCORRÊNCIA –AULA 8 PROGRAMAÇÃO ORIENTADA A OBJETOS Qual devo Usar

THREADS E CONCORRÊNCIA – AULA 8

PROGRAMAÇÃO ORIENTADA A OBJETOS

FIM