Beruflich Dokumente
Kultur Dokumente
Threads
Prof. Esp. Flvio Almeida Ferreira
Prof. Esp. Flvio Almeida Ferreira
Sumrio
O que so Threads
Multithreads
Porque utilizar threads
Utilizando threads
Sincronismo entre threads
Principais mtodos
Mais informaes
O que so threads?
Threading um artifcio que permite a coexistncia de mltiplas
atividades dentro de um nico processo.
Java a primeira linguagem de programao a incluir
explicitamente o conceito de Threads na prpria linguagem.
O que so threads?
Threads so tambm chamados de processos leves (lightweight
processes), pois, da mesma forma que processos, threads so
independentes, possuem sua prpria pilha de execuo, seu
prprio program count e suas prprias variveis locais.
Porm, threads de um mesmo processo compartilham memria,
descritores de arquivos (file handles) e outros atributos que so
especficos daquele processo.
O que so threads?
Um processo pode conter mltiplas threads que parecem executar
ao mesmo tempo e de forma assncrona em relao as outras
threads.
Todas as threads de um mesmo processo compartilham o mesmo
espao de endereamento de memria, o que significa que elas
tm acesso as mesmas variveis e objetos, e que eles podem alocar
novos objetos de um mesmo heap.
Ao mesmo tempo que isso torna possvel que threads
compartilhem informaes entre si, necessrio que o
desenvolvedor se assegure que uma thread no atrapalhe a
execuo de outra.
Prof. Esp. Flvio Almeida Ferreira
O que so threads?
A API de threads em Java incrivelmente simples. Mas escrever
um programa complexo que as use de forma eficiente e correta
no to simples assim.
responsabilidade do programador impedir que uma thread
interfira de forma indesejvel no funcionamento das outras
threads do mesmo processo.
Utilizando Threads
Criando threads
H duas formas equivalentes de criarmos uma thread em Java:
Utilizando Threads
Utilizando Threads
Criando threads
A sada do texto, como esperado, so as duas mensagens
intercaladas aleatoriamente na sada padro.
Dependendo do sistema operacional e dos recursos
computacionais do computador a sada pode parecer seqencial.
Esse comportamento pode ser explicado pelas propriedades das
threads.
Utilizando Threads
Criando threads
Apesar das duas formas de uso de threads serem equivalentes,
classes que necessitem estender outra classe que no Thread
so obrigadas a usar a interface Runnable, j que Java no possui
herana mltipla.
Alm disso, os puristas em orientao a objetos dizem que
normalmente estamos interessados em criar classes que usem
threads e no classes que sejam threads e que, portanto,
deveramos implementar toda a lgica em uma classe que
implementa Runnable e depois criar a thread s quando for
necessrio.
Prof. Esp. Flvio Almeida Ferreira
Utilizando Threads
Estados de uma thread
Uma thread pode estar em um dos seguintes estados:
Criada;
Em execuo;
Suspensa;
Morta.
Utilizando Threads
Estados de uma thread
A nica transio vlida neste estado a transio para o estado
em execuo.
A thread passa para o estado em execuo quando o mtodo
start() do objeto chamado.
Neste ponto a thread pode ficar em execuo, se tornar
suspensa ou se tornar morta.
Utilizando Threads
Estados de uma thread
Na verdade, uma thread pode estar em execuo mas, ainda
assim, no estar ativa.
Em computadores que possuem um nico processador impossvel
existirem duas threads executando ao mesmo tempo. Dessa forma
uma thread que est esperando para ser executada pode estar no
estado em execuo e ainda assim estar parada.
Utilizando Threads
Estados de uma thread
A thread se torna suspensa quando um destes eventos ocorrer:
Utilizando Threads
Estados de uma thread
A chamada ao comando sleep(int seconds) faz com que a thread
espere um tempo determinado para executar novamente.
A thread no executada durante este intervalo de tempo mesmo
que o processador se torne disponvel novamente. Aps o intervalo
dado, a thread volta ao estado em execuo novamente.
Utilizando Threads
Estados de uma thread
Se a thread chamar o comando wait() ento ela deve esperar uma
outra thread avisar que a condio foi satisfeita atravs dos
comandos notify() ou notifyAll().
Utilizando Threads
Estados de uma thread
Se a thread estiver esperando uma operao de entrada/sada ela
retornar ao estado em execuo assim que a operao for
concluda.
Por fim, a thread se torna morta se o mtodo run() chegar ao fim
de sua execuo ou se uma exceo no for lanada e no for
tratada por um bloco try/catch.
Utilizando Threads
Propriedades thread
Anteriormente foi dito que diversas threads podem executar
concorrentemente em um processo. Porm em sistemas
monoprocessados isso parcialmente verdade.
Conceitualmente isso que ocorre. Mas na prtica apenas uma
thread pode ocupar o processador por vez.
Utilizando Threads
Propriedades thread
A mquina virtual de Java define uma ordem para que as threads
ocupem o processador de forma que o usurio tem a iluso de que
elas realmente executam concorrentemente.
A isso dado o nome de escalonamento de tarefas.
Utilizando Threads
Propriedades thread
As prioridades de threads em Java podem variar entre os inteiros
Thread.MIN PRIORITY e Thread.MAX PRIORITY.
Quanto maior o inteiro, maior a prioridade. Para definir a
prioridade de uma thread necessrio chamar o mtodo
setPriority(int priority) da classe Thread aps a instanciao do
objeto.
Utilizando Threads
Propriedades thread
A mquina virtual utilizar sua prioridade relativa para realizar o
escalonamento.
A mquina virtual sempre escolhe a thread com maior prioridade
relativa e que esteja no estado de execuo para ser executada.
Utilizando Threads
Propriedades thread
Uma thread de menor prioridade s ser executada se a thread
atual for para o estado suspenso, se o mtodo run() terminar ou
se o mtodo yield(), cuja finalidade dar chance para que outras
threads executem, for chamado.
Se existirem duas threads de mesma prioridade esperando para
serem executadas, a mquina virtual escolher uma delas, como
em um escalonamento do tipo round-robin.
Utilizando Threads
Propriedades thread
A thread escolhida continuar ocupando o processador at que
uma das seguintes condies se tornem verdadeiras:
uma thread de maior prioridade fica pronta para ser executada;
Utilizando Threads
Propriedades thread
Como regra geral, podemos pensar que o escalonador escolher
sempre a thread com maior prioridade para ser executada em
determinado momento.
Porm, a mquina virtual livre para escolher uma thread de
menor prioridade para evitar espera indefinida (starvation).
Utilizando Threads
Fatia de tempo
Alguns sistemas operacionais como o GNU/Linux ou o Microsoft
Windows fornecem para cada thread fatias de tempo (timeslices), que nada mais so do que o intervalo de tempo mximo que
a thread pode ocupar o processador antes de ser obrigada a cedlo a outra thread.
Utilizando Threads
Fatia de tempo
O exemplo anterior produziria o seguinte resultado em sistemas
que no possuem fatias de tempo para suas threads:
Usando Runnable
(...) ("Usando Runnable" repetido 998 vezes)
Usando Runnable
Usando Herana
(...) ("Usando Herana" repetido 998 vezes)
Usando Herana
Utilizando Threads
Fatia de tempo
J em um ambiente com fatias de tempo, as threads seriam
Interrompidas e o resultado da execuo seria assim:
Usando Runnable
Usando Runnable
Usando Herana
Usando Runnable
Usando Herana
Usando Herana
(...)
Prof. Esp. Flvio Almeida Ferreira
Utilizando Threads
Fatia de tempo
A especificao de Java no garante que o ambiente ter fatias de
tempo.
Fatias de tempo s ocorrero se o programa rodar em um sistema
operacional que possua essa caracterstica.
Seus programas no devem partir desse pressuposto.
Atividade