Vous êtes sur la page 1sur 33

Programao em Memria Compartilhada - Threads

Prof. Guilherme C. Kurtz

Definies:
Processo apenas um programa em execuo
acompanhado dos valores atuais do contador de
programa, registradores e variveis (Tanenbaum)
CPU troca de um processo para o outro simulando o
paralelismo (troca de contexto). Cada processo
executado em um determinado momento;
O contador de programa contm o endereo de
memria da prxima instruo a ser executada;

Definies:
Processo consiste em um ambiente de execuo,
junto com uma ou mais threads (Coulouris)
Ambiente de execuo: unidade de gerenciamento de
recursos locais, sendo gerenciados pelo ncleo
(kernel) aos quais as threads tem acesso;
Os ambientes de execuo representam um domnio
onde as threads so executadas;

Threads podem ser vistas como mini-processos, em que


cada thread ir executar sua prpria poro de cdigo;

Threads compartilham a CPU do mesmo modo que


diferentes processos (denominado timesharing);

Threads que fazem parte de um mesmo processo no so


independentes como no caso de diferentes processos:

Todas as threads de um mesmo processo possuem a mesma


regio de memria, compartilhando as mesmas variveis globais;
Uma thread pode ler, escrever ou mudar os dados de uma outra
thread;

Portanto, os dados no so protegidos uns dos outros:


A proteo deve ser feita pela aplicao!

Diferena entre threads e processos em relao a


memria:

Threads/Processos podem estar em diferentes estados:


novo, pronto, executando, bloqueado e finalizado;
CRIAO DO
PROCESSO

Novo

FIM DO
PROCESSO

Despachado
(pelo escalonador)

admitir

Pronto

Executando

liberar

Time-out
(seleciona outro
processo)
desbloqueado
quando o
evento
esperado
ocorre

bloqueado a
espera de um
evento

Bloqueado

Sada

Uma thread pode ser implementada:


Pelo prprio sistema operacional
Por uma biblioteca;

A linguagem Java fornece o suporte a threads


ao nvel de programao;
O mtodo main() a principal thread na
execuo de uma aplicao Java.

Netbeans
Exemplos desenvolvidos na IDE e
disponibilizados pelo professor atravs do
moodle.

Desenvolver exemplo 1:
Demonstrao da Thread principal main()

Uma forma de criar threads em java criar uma classe


derivada (extends) da classe Thread, e redefinir o
mtodo run() dessa classe;

Um objeto dessa classe executar como uma thread de


controle separado na mquina virtual;

A criao do objeto derivado da classe Java s especifica a


thread;

A criao e inicializao da thread fica por conta do


mtodo start();

O mtodo start()aloca memria e inicializa uma nova


thread na mquina virtual;

Desenvolver exemplo 2:
Criao de uma Thread atravs de uma classe
derivada de Thread

Uma outra forma de implementar uma thread


definir uma classe com a interface Runnable;
Quando uma classe implementa Runnable,
novamente dever ser definido o mtodo run()
e implement-lo da mesma forma anterior;
A nica diferena acontecer quando for criada a
thread, conforme pode ser visto no cdigo a
seguir.

Desenvolver exemplo 3:
Criao de uma Thread atravs de uma classe que
implementa Runnable

extends Thread ou implements Runnable?


A princpio, utilizar extends Thread mais
simples;
Porm, se for necessrio estender alguma outra
classe, no ser possvel, pois java no suporta
mltipla herana;
Ao utilizar Runnable, a classe poder estender
outra classe, visto que neste casso estaremos
implementando e no estendendo.

extends Thread ou implements Runnable?


Outra diferena entre implementar Runnable e
estender Thread que, ao estender Thread, cada
uma das suas threads ter um nico objeto
associada a ela;
J implementando Runnable, vrias threads podem
compartilhar a mesma instancia do objeto, como
mostra o exemplo MinhaAppRunnableVsThread

Demonstrar exemplo 4:
MinhaAppRunnableVsThread

Antes da chamada ao mtodo t.start()

Antes de realizar a chamada a este mtodo, a thread est no


estado novo;
Ns temos o objeto thread, mas ainda no temos uma thread
real, pois no foi colocada em execuo;

Aps a chamada ao mtodo start()


Uma nova thread de execuo iniciada;

A thread passar do estado novo para o estado executvel;

Quando a thread executada, o mtodo run() executado.

O comportamento das threads no garantido, pois a


documentao java no fala nada a respeito sobre a
ordem de execuo das threads;

Tambm no h garantias de que, uma vez iniciada, ela


ser concluda;

A ordem de inicializao no afeta a ordem de execuo;

Uma thread deixar de ser thread quando o seu mtodo


run() concludo;

Uma thread jamais poder ser reinicializada, ou seja, se


for feita uma chamada ao start() novamente, ser
gerada uma exceo.

Permitem interromper ou retomar o funcionamento de uma Thread

Deve-se ter cuidado ao realizar uma chamada a estes mtodos.

Mtodos de Suspenso:
suspend()

Suspente a execuo de uma thread que estiver em processamento naquele


momento;

sleep(long millis)

Suspende a execuo de uma thread por um determinado perodo de tempo (em


milissegundos);

resume()

Retorna a execuo de uma thread que foi suspensa;

stop()

Interrompe permanentemente a execuo de uma thread;

Desenvolver exemplo 5:
Mtodos de suspenso

O mtodo isAlive() retorna true caso uma


thread no tenha terminado a execuo do
mtodo run();
Apresentar exemplo
Ex_isAlive.java

As prioridades em threads indicam quanto


recurso deve ser dado a determinada thread;
Portanto, uma thread com alta prioridade
receber mais tempo de CPU que uma thread
de baixa prioridade;
Para isso, existe o mtodo
setPriority(int newPriority)que define
a prioridade de determinada thread.

setPriority(int newPriority)
A prioridade vai de 1 a 10, sendo o valor padro 5;
Quanto maior o valor, maior a prioridade;
Alm disso, existem as constantes:
Thread.MAX_PRIORITY que vale 10;
Thread.MIN_PRIORITY que vale 1;
Thread.NORM_PRIORITY que vale 5;

getPriority()
Retorna a prioridade daquela thread;

Apresentar exemplo:
Ex_prioridades.java

Prioridade de threads:
Mtodo yield():
Faz com que uma thread passe do estado
executando para pronto;
passa a CPU para outra thread a fim de que outras
threads com outras prioridades tenham sua
oportunidade de executar;

Apresentar exemplo:
Ex_yield.java

Faz com que uma thread aguarde o


encerramento da execuo de outra thread.
Apresentar exemplo:
Ex_join.java

Quando duas ou mais threads precisam utilizar


ao mesmo tempo um objeto, existe a
possibilidade de haver uma corrupo dos
dados;
As sees/mtodos/blocos destes programas
que possuem tais dados so denominados
sees crticas;
Para solucionar este problema, necessrio
sincronizar estas regies atravs de monitores
ou locks, para que somente uma thread possa
utilizar um recurso por vez;

possvel sincronizar mtodos:

public synchronized void Sacar(int valor){


...
}

Ou blocos de mtodos:

public void Sacar(int valor){


synchronized(this){
...
}
}

Apresentar exemplo:
Ex_sincronizacao.java

Interao entre threads


A classe Object possui trs mtodos que permitem
que threads possam se comunicar a respeito do
estado de bloqueio de um recurso:
wait(), notify() e notifyAll();

Uma thread pode obter um bloqueio sobre


determinado recurso atravs do mtodo wait(), e
ser notificada/desbloqueada por outra thread
atravs de uma chamada ao mtodo notify()
sobre esse recurso;

Interao entre threads

Geralmente o wait() utilizado quando uma thread est


esperando por uma determinada condio que est sobre
controle de foras externas (geralmente outras threads).
No legal ficar testando uma condio dentro de um lao
indefinidamente, pois isso causa a chamada espera ocupada:

Que caracterizada por testes repetidos de uma condio, que


impedem o progresso de uma thread, e que s pode ser alterada por
outro thread;

Esta espera desperdia muito o uso do processador, pois gasta muito


tempo testando uma condio sem fazer algo til.

O wait() permite que voc coloque uma thread para dormir


enquanto aguarda pela mudana da condio, e somente quando
o notify() ou notifyAll() ocorrer, a thread ir acordar e
verificar se houveram mudanas.

Apresentar exemplo 3
Ex_wait_notify.java

Vous aimerez peut-être aussi