aula - threads

33
Programação em Memória Compartilhada - Threads Prof. Guilherme C. Kurtz

Upload: kaina-almeida

Post on 16-Dec-2015

263 views

Category:

Documents


0 download

DESCRIPTION

Aulas sobre Threads

TRANSCRIPT

  • 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;

    Novo Pronto

    Bloqueado

    Executando Sada admitir liberar

    desbloqueado quando o

    evento esperado

    ocorre

    Despachado (pelo escalonador)

    bloqueado a espera de um evento

    Time-out (seleciona outro

    processo)

    FIM DO PROCESSO

    CRIAO DO PROCESSO

  • 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