Sie sind auf Seite 1von 24

Engenharia de Computao

Tpicos Especiais I

Programao concorrente: Threads

Prof. Jan Erik Natal, 2015.1

Introduo
Em vrias situaes, precisamos "rodar duas coisas ao mesmo
tempo". Imagine um programa que gera um relatrio muito grande
em PDF. um processo demorado e, para dar alguma satisfao
para o usurio, queremos mostrar uma barra de progresso.
Queremos ento gerar o PDF e ao mesmo tempo atualizar a
barrinha.
Pensando um pouco mais amplamente, quando usamos o
computador tambm fazemos vrias coisas simultaneamente:
queremos navegar na internet e ao mesmo tempo ouvir msica.
A necessidade de se fazer vrias coisas simultaneamente, ao
mesmo tempo, paralelamente, aparece frequentemente na
computao. Para vrios programas distintos, normalmente o prprio
sistema operacional gerencia isso atravs de vrios processos em
paralelo.
Em um programa s (um processo s), se queremos executar
coisas em paralelo, normalmente falamos de Threads.
2 /24

Threads
uma forma de um processo dividir a si mesmo em
duas ou mais tarefas que podem ser executadas
concorrencialmente. O suporte thread fornecido pelo
prprio sistema operacional, no caso da linha de execuo
ao nvel do ncleo (em ingls: Kernel-Level Thread (KLT)),
ou implementada atravs de uma biblioteca de uma
determinada linguagem, no caso de uma User-Level
Thread (ULT).

3 /24

Thread x Processos
Thread

Processo

Mais Leve

Mais Pesado

Recursos compartilhados

Recursos Prprios(I/O, ...)

Enderecamento compartilhado

Endereamento Prprio

Ambiente de execuo Compartilhada

Ambiente de Execuo prprio

Existe dentro de um Processo

Possui ao menos um thread

4 /24

Vantagens de usar Threads


A criao e terminao de uma thread nova em geral

mais rpida do que a criao e terminao de um


processo novo;
A comutao de contexto entre duas threads mais
rpido do que entre dois processos;
menos custoso gerenciar threads do que processos;
Pode prover melhora na performance
Mltiplas Threads podem compartilhar recursos
Utiliza multiprocessadores se disponvel
5 /24

Processo Mono e MultiThreads

6 /24

Implementao de Threads
Nas linguagens de programao o uso de Threads

feito utilizando bibliotecas:


Em Java, Threads so implementados como uma
Classe:

pacote

java.lang.Thread,

que

uma

extenso da Classe Thread.


Em C e C++, necessitam de biblioteca especifica
para processamento: POSIX Threads (C) e Boost
(C++)

7 /24

Exemplo Thread em C

8 /24

Principais Mtodos de uma Thread Java


run():

o mtodo que executa as atividades de uma


THREAD. Quando este mtodo finaliza, a THREAD
tambm termina.
start(): mtodo que dispara a execuo de uma THREAD.
Este mtodo chama o mtodo run( ) antes de terminar.
sleep(int x): mtodo que coloca a THREAD para dormir
por x milisegundos.
join( ): mtodo que espera o trmino da THREAD para
qual foi enviada a mensagem para ser liberada.
interrupt( ): mtodo que interrompe a execuo de uma
THREAD.
interrupted( ): mtodo que testa se uma THREAD est ou
no interrompida.
9 /24

Estados de uma Thread Java

10 /24

Prioridade de Thread Java


Em

Java, a prioridade determinada com um inteiro


entre 1 e 10. A prioridade padro o valor 5. 10 a
maior prioridade e 1 a menor. A THREAD herda a
prioridade da THREAD que a criou.
void setPriority(int prioridade);
int getPriority( );

11 /24

Implementao de uma Thread Java


Existem duas maneiras de criar explicitamente Threads em Java:
Estendendo a classe Thread e instanciando um objeto desta
nova classe:

Implementando a interface Runnable e passando um objeto


desta nova classe como argumento do construtor da classe
Thread.

Prefira implementar Runnable a herdar a Thread.


12 /24

Exemplo 1 Estendendo a classe Thread

13 /24

Exemplo 2 Implementando Runnable

14 /24

Implementando Thread Runnable Anonymous


Existe uma terceira maneira de implementar Thread de
forma no explicita (fora das classes):

15 /24

Sincronizao de Threads
Duas ou mais Threads dentro de um programa podem
acessar ou modificar um mesmo recurso ou dado, isto
pode produzir um resultado imprevisto e errado devido ao
problema da concorrncia.
Desta forma, sincronizar Threads necessrio para

coordenar e evitar operaes simultneas em um mesmo


dado.
Uma maneira simples de resolver isto em Java
usando a palavra reserva synchronized.
16 /24

Exemplo de cdigo no sincronizado

17 /24

Sincronizao de Threads
Existem algumas tcnicas para sincronizar Threads

e/ou processos, todavia estudaremos duas maneiras


bsicas de sincronizao usando a palavra reserva
synchronized do Java:
Mtodos
Blocos

18 /24

sincronizados

sincronizados

Mtodos sincronizados

19 /24

Bloco sincronizado
public class TwoCounters {
private long c1 = 0, c2 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
synchronized(lock1) {
c1++;
}
}
public void inc2() {
synchronized(lock2) {
c2++;
}
}
}

20 /24

Exemplo Sincronizao programa principal

21 /24

Sincronizao 1 exemplo do PrintNumbers

22 /24

Sincronizao 2 exemplo do PrintNumbers

23 /24

Threads Links teis


http://www.tutorialspoint.com/java/java_thread_synchronization.htm
http://tutorials.jenkov.com/java-concurrency/synchronized.html
http://www.caelum.com.br/apostila-java-orientacao-objetos/programacaoconcorrente-e-threads/
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
http://www.inf.puc-rio.br/~inf1621/java2.pdf

http://pt.slideshare.net/marciopalheta/trabalhando-com-threads-em-java
http://pt.wikipedia.org/wiki/Thread_(ci%C3%AAncia_da_computa%C3%A7%
C3%A3o)

24 /24

Das könnte Ihnen auch gefallen