Programação Concorrente
com Thread Java
ALBERTO WILLIAN MASCARENHAS
http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Introdução
Todos os sistemas operacionais modernos
possuem o conceito de processos que, de
forma simplificada, são programas diferentes
e independentes executados pelo sistema
operacional.
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread Mais InformaçõesIntrodução
• Threads são sub-procesos no sistema operacional.
• É menos custoso gerenciar threads do que processos.
• As linguagens Java e Ada possuem funcionalidades
MULTITHREADING na própria estrutura da linguagem.
• C e C++ necessitam de biblioteca especifica para
processamento MULTITHREADING T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
Introdução
Um processo pode conter múltiplas threads que parecem executar ao mesmo tempo e de forma assíncrona em relação as outras threads. T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
Introdução
Por que utilizar threads?
Responsividade em Interfaces Gráficas: imagine se o seu
navegador web parasse de carregar uma página só porque você clicou no menu “arquivo”;
Sistemas multiprocessados: o uso de threads permite dividir as tarefas entre todos os processadores disponíveis
aumentando, assim, a eficiência do processo;
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
Introdução
Por que utilizar threads?
Simplificação na Modelagem de Aplicações: suponha que você precise fazer um programa que simule a interação entre
diferentes entidades. Carros em uma estrada, por exemplo. É mais fácil fazer um loop que atualiza todos os carros da
simulação ou criar um objeto carro que anda sempre que tiver espaço a frente dele?
Processamento assíncrono ou em segundo plano: com threads um servidor de e-mail pode, por exemplo, atender a mais de um usuário simultaneamente. T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
2. Utilizando threads
Em Java, threads são implementadas como uma CLASSE
– Pacote java.lang.Thread
– É uma extensão da classe Thread
– Contrutores:
• public Thread (String nome_da_thread);
• public Thread ( ); // o nome sera Thread-# Thread-1, Thread-2
T h re ad s Jav a Introdução Utilizando threads
Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
2. Utilizando threads
Existem duas maneiras possíveis para criarmos
threads em Java:
a) Estendendo a class Thread.
b) Implementando a interface Runnable.
T h re ad s Jav a Introdução Utilizando threads
Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
2. Utilizando threads
T h re ad s Jav a Introdução Utilizando threadsPossíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
2. Utilizando threads
T h re ad s Jav a Introdução Utilizando threadsPossíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
2. Utilizando threads
Apesar das duas formas de uso de threads serem equivalentes, classes que necessitem estender outra classe que não Thread são obrigadas a usar a interface Runnable já que Java não possui herança múltipla. Além disso, os “puristas” em
orientação a objetos dizem que normalmente estamos
interessados em criar classes que usem threads e não classes que sejam threads e que, portanto, deveríamos implementar toda a lógica em uma classe que implementa Runnable e
depois criar a thread só quando for necessário.
T h re ad s Jav a Introdução Utilizando threads
Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
3. Possíveis estados de uma thread
T h re ad s Jav aUma thread pode estar em um dos seguintes estados: Criada, em execução, suspensa ou morta. Introdução Utilizando threads
Possíveis estados de uma thread Alguns métodos da classe Thread Mais Informações
Ciclo de vida de uma thread
T h re ad s Jav a Introdução Utilizando threadsPossíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
3. Possíveis estados de uma thread
T h re ad s Jav aUma thread se encontra no estado “criada” logo
após a instanciação de um objeto Thread. Neste ponto nenhum recurso foi alocado para a thread. A única transição válida neste estado é a transição ao para o estado “em execução”.
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
A thread passa para o estado “em execução” quando
o método start() do objeto é chamado. Neste ponto a
thread pode ficar “em execução”, se tornar “suspensa” ou se tornar “morta”.
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
Na verdade, uma thread pode estar “em execução”
mas, ainda assim, não estar ativa. Em computadores que possuem um único processador é impossível
existirem duas threads executando ao mesmo tempo. Dessa forma uma thread que está esperando para ser executada pode estar no estado “em execução” e
ainda assim estar parada.
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
A thread se torna “suspensa” quando um destes
eventos ocorrer:
execução do método sleep();
a thread chama o método wait() para esperar que
uma condição seja satisfeita;
a thread está bloqueada em uma operação de
entrada/saída (I/O).
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
A chamada ao comando sleep(int ms) faz com que a
thread espere um tempo determinado para executar novamente. A thread não é executada durante este intervalo de tempo mesmo que o processador se torne disponível novamente.
Após o intervalo dado, a thread volta ao estado “em
execução” novamente
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
Se a thread chamar o comando wait() então ela deve
esperar uma outra thread avisar que a condição foi
satisfeita através dos comandos notify() ou notifyAll().
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
Se a thread chamar o comando wait() então ela deve
esperar uma outra thread avisar que a condição foi
satisfeita através dos comandos notify() ou notifyAll().
Se a thread estiver esperando uma operação de
entrada/saída ela retornará ao estado
“em execução” assim que a operação for concluída.
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
T h re ad s Jav a
Por fim, a thread se torna “morta” se o método run()
chegar ao fim de sua execução ou se uma exceção não for lançada e não for tratada por um bloco try/catch.
3. Possíveis estados de uma thread
Introdução Utilizando threads
Possíveis estados de uma thread
Alguns métodos da classe Thread Mais Informações
4. Alguns métodos da classe Thread:
run()
deve estar presente em todas as threads.
start()
Registra a thread no thread scheduler.
getName()/setName()
Atribui ou retorna o nome de uma thread.
Por default as threads são nomeadas numericamente.
yield()
Faz com que a thread corrente pause, possibilitando que outra thread seja despachada.
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread
Alguns métodos da classe Thread
4. Alguns métodos da classe Thread:
sleep()
Faz com que a thread fique em estado de espera uma
quantidade mínima de tempo, em ms, possibilitando a CPU executar outras threads.
interrupt()
Atribui à thread o estado de interrompível.
isInterrupted()
Verifica se foi atribuído à thread o estado de interrompível.
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread
Alguns métodos da classe Thread
4. Alguns métodos da classe Thread:
getPriority()/setPriority()
Atribui ou retorna a prioridade de despacho de uma thread.
join()
Condiciona a continuação da execução de uma thread ao término de uma outra.
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread
Alguns métodos da classe Thread
4. Alguns métodos da classe Thread:
getPriority()/setPriority()
Atribui ou retorna a prioridade de despacho de uma thread.
join()
Condiciona a continuação da execução de uma thread ao término de uma outra.
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread
Alguns métodos da classe Thread
4. Alguns 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. T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread
Alguns métodos da classe Thread
T h re ad s Jav a
•
Em Java, a prioridade é determinada com um
inteiro entre
1
e
10
.
•
A prioridade padrão é o valor 5.
•
10 é a maior prioridade e 1 é a menor.
•
A
THREAD
herda a prioridade da
THREAD
que
acriou.
•
void
setPriority
(int prioridade)
;
•
int
getPriority
( )
;
T h re ad s Jav a
Prioridade de Thread
Prioridade 10 Prioridade 1 Prioridade 9 Prioridade 8 Prioridade 2 Prioridade 3 . . . A B C D E F GT h re ad s Jav a
EXERCÍCIO
•
Prioridades de Threads
•
Utilize o método
setPriority(int)
para mudar a
prioridade de threads
– Utilize 01 thread com prioridade 1, 01 com
prioridade 09 e as outras com prioridade 5.
– Faça com que uma das threads de alta prioridade
durma por 10 ms antes de terminar.
– Faça com que outra thread de alta prioridade faça
T h re ad s Jav a
EXERCÍCIO
•
Problema
Produtor X Consumidor
- Com buffer de tamanho 1. - Variáveis compartilhadas.
- A solução do problema seria utilizar-se duas
THREADS: 01 consumidor e 01 produtor.
- O que ocorre se não houver sincronização entre a leitura e escrita?
CRÉDITOS
Universidade Federal do Rio de Janeiro – IM/DCC Utilização de threads em Java
Prof. Austeclynio Pereira
e-mail: austeclyniop@posgrad.nce.ufrj.br
Introdução ao uso de Threads em Java
Daniel de Angelis Cordeiro
danielc@ime.usp.br
www.ime.usp.br/~gold/cursos/2004/mac438/threadsEmJava.pdf
Programação Concorrente com Thread Java
Luiz Affonso Guedes
Sistemas Distribuidos T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread
5. Referências
[1] JavaTM2 Plataform API Specification. http://java.sun.com/j2se/1.4.2/docs/api/.
[2] James Gosling, Bill Joy, Gilad Bracha e Guy Steele. The Java Language Specification, 2a edição. Addison-Wesley, 2000. Dispon´ıvel em http://java.sun.com/docs/books/jls/.
[3] Mary Campione e Kathy Walrath. The Java Tutorial, terceira edição. Addison-Wesley, 1998. Disponível em http://java.sun.com/docs/books/tutorial/.
[4] Brian Goetz. Introduction to Java threads. IBM DeveloperWorks, setembro 2002. Disponível em http://www-106.ibm.com/developerworks/edu/j-dw-javathread-i.html.
[5] Alex Roetter. Writing multithreaded Java applications. IBM DeveloperWorks, fevereiro 2001. Disponível em http://www-106.ibm.com/developerworks/library/j-thread.html.
[6] Brian Goetz. Double-checked locking: Clever, but broken. JavaWorld, fevereiro 2001. Disponível em http://www.javaworld.com/jw-02-2001/jw-0209-double.html.
[7] Doug Lea. Synchronization and the Java Memory Model. Disponível em http://gee.cs.oswego.edu/dl/cpj/jmm.html. [8] David Bacon et al. The ”Double-Checked Locking is Broken” Declaration. Disponível em
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html.
[9] Neel Kumar. IBM DeveloperWorks, abril 2000. Disponível em http://www-106.ibm.com/developerworks/java/library/j-threadsafe/.
[10] Gregory Andrews. Foundations of Multithreaded, Parallel and Distributed Programming. Addison-Wesley, 1999.
T h re ad s Jav a Introdução Utilizando threads Possíveis estados de uma thread Alguns métodos da classe Thread