Você está na página 1de 11

Universidade Federal do Rio de Janeiro IM/DCC

Utilizao de threads em Java


Prof. Austeclynio Pereira
e-mail: austeclyniop@posgrad.nce.ufrj.br

Ciclo de vida de uma thread


nascimento
start

pronta
notify notifyAll

yield

termina E/S

wait

tempo expira

sleep

em execuo

inicia E/S end

esperando

dormindo

morta

bloqueada

Criando threads em Java


Existem duas maneiras possveis para criarmos threads em Java:
Estendendo a class Thread. Implementando a interface Runnable.

Criando threads em Java estendendo a class Thread

O start() faz com que a Java Virtual Machine invoque o mtodo run da Thread .

Criando threads em Java implementando a interface Runnable

Utilizando threads em Java


Alguns mtodos 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 so nomeadas numericamente.

yield()
Faz com que a thread corrente pause, possibilitando que outra thread seja despachada.

Utilizando threads em Java


Alguns mtodos da classe Thread:
sleep()
Faz com que a thread fique em estado de espera uma quantidade mnima de tempo, em ms, possibilitando a CPU executar outras threads.

interrupt()
Atribui thread o estado de interrompvel.

isInterrupted()
Verifica se foi atribudo thread o estado de interrompvel.

Utilizando threads em Java


Alguns mtodos da classe Thread:
getPriority()/setPriority()
Atribui ou retorna a prioridade de despacho de uma thread.

join()
Condiciona a continuao da execuo de uma thread ao trmino de uma outra.

Utilizando threads em Java


Alguns mtodos da classe Object:
wait()
Utilizado para sincronizar acesso a um objeto. Coloca a thread corrente em estado de espera at que outra thread chame os mtodos notify ou notifyAll liberando o objeto.

notify()
Acorda a thread que, voluntariamente, estava esperando a liberao de um objeto.

notifyAll()
Acorda todas as threads que estavam esperando a liberao de um objeto.

Sincronizando threads em Java


Quando duas threads precisam utilizar ao mesmo tempo um objeto existe a possibilidade de haver corrupo de dados. As sees de um programa que tm o potencial de provocar este dano so chamadas de regies crticas. Para evitar esta situao, o acesso por estas regies crticas deve ser sincronizado. As threads devem estabelecer um acordo de forma que antes que qualquer instruo de uma regio crtica seja executada um lock do objeto deve ser adquirido.

Sincronizando threads em Java


Estando o objeto locked qualquer outra thread fica impossibilitada de acess-lo at que o objeto fique liberado(unlocked). Cada objeto tem seu prprio lock. O lock pode ser adquirido ou liberado atravs do uso de mtodos ou instrues synchonized. O objeto fica atomicamente bloqueado quando o seu mtodo synchronized invocado.

Sincronizando threads em Java


A sincronizao fora com que as execues de duas ou mais threads sejam mtuamente exclusivas no mesmo espao de tempo. O lock automaticamente liberado assim que o mtodo synchronized termina.

Sincronizando threads em Java


Adquire lock
Mtodo synchronized

Espera para adquirir o lock

Adquire lock Libera o lock


Mtodo synchronized

Libera o lock

Sincronizando threads em Java

Sincronizando threads em Java


synchonized Statements
Permite que a sincronizao seja feita apenas em uma poro do cdigo. Como a sincronizao afeta a performance, este processo mais eficaz. Com synchronized statements somente fica locked o absolutamente necessrio. Sintaxe:
synchonized (objeto que ser locked) { statements }

Sincronizando threads em Java

Sincronizando threads em Java


O mecanismo de sincronizao suficiente para evitar que as threads interfiram umas com as outras, mas pode ocorrer a necessidade de as threads se comunicarem. Os mtodos wait(), notify() e notifyAll() tm o propsito de permitir a comunicao entre as threads. O mtodo wait() faz com que a thread fique em estado de espera at que determinada condio acontea. Os mtodos notify() e notifyAll() informam s threads, em estado de espera, que alguma coisa ocorreu e que pode satisfazer quela condio.

Sincronizando threads em Java


Formas de uso:
wait()
synchronized void facaQuandoCondicao() { while (!condicao) { try{ wait(); } catch(InterruptedException e) {} } instrues quando a condio for verdadeira

Sincronizando threads em Java


Formas de uso:
notify(); notifyAll: synchronized void trocaCondicao() { troca os valores usados para o teste da condio notifyAll(); // ou notify() }

Sincronizando threads em Java


O mtodo que testa a condio precisa ser synchronized pois ningum pode garantir que aps o while a condio j foi alterada por outra thread. O wait() suspende a execuo da thread e libera o lock do objeto. Quando a thread reiniciada o lock readquirido. O teste da condio deve estar sempre em loop. Nunca podemos assumir que se fomos notificados implica em condio satisfeita. No podemos trocar o while por um if.

Bibliografia
The Java Programming Language 3rd Edition Ken Arnold, James Gosling, David Holmes Murachs Beginning Java 2 Andrea Steelman

Você também pode gostar