Programação Concorrente com Thread Java

Document Sample
scope of work template
							Programação Concorrente
    com Thread Java
    Luiz Affonso Guedes
    Sistemas Distribuidos
          Definições Básicas
• 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
  – Posix p_thread
           Thread em Java
• 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,…
      Principais Métodos
– run(): é o método que executa as
  atividades de uma THREAD. Quando
  este método finaliza, a THREAD também
  termina.
– start(): método que dispara a execução
  de uma THREAD. Este método chama o
  método run( ) antes de terminar.
– sleep(int x): método que coloca a
  THREAD para dormir por x milisegundos.
      Principais Métodos
– join( ): método que espera o término da
  THREAD para qual foi enviada a mensagem
  para ser liberada.
– interrupt( ): método que interrompe a
  execução de uma THREAD.
– interrupted( ): método que testa se uma
  THREAD está ou não interrompida.
      Estados de uma Thread em Java
                                     nascimento
Término do tempo de dormida
                                                  start( )
                                                                    Fim da E/S
          notify( )
                                         pronta
           notifyAll( )
                                     run( )       Alocar um processador

                                      executando

          wait( )                                                   E/S
                          sleep( )                  Fim do
                                                    Método run( )

      esperando           dormindo                morta              bloqueada
       Prioridade de Thread
• 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( );
Algoritmo de Escalonamento
Prioridade 10   A       B


Prioridade 9        C

Prioridade 8

     .
     .
     .

Prioridade 3        D       E   F


Prioridade 2


Prioridade 1                G
             Exemplo 01
• O programa cria 04 threads e as coloca
  para dormir.
• ThreadBasica é uma extensão da classe
  Thread.
             Exercício 01
– Analise como se chama o método sleep().
– Crie n THREADs, onde n é definido pelo
  usuário.
– Utilize o método join no main para esperar as
  THREADs terminarem.
  • try {
      uma_thread.join( ); // uma_thread.join(tempo)
      ...}
    catch (InterruptedException e) { … }
 Escalonamento de Threads
Prioridade 10   A       B


Prioridade 9        C

Prioridade 8

     .
     .
     .

Prioridade 3        D       E   F


Prioridade 2


Prioridade 1                G
               Exemplo 02
• 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 uma entrada de dado.
               Exemplo 03
• 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?
             Exemplo 04
• Problema do Produtor X Consumidor com
  sincronizacao do Buffer.
• Em Java, a sincronização entre threads é
  feita através do conceito de monitores.
• Monitor é um agrupamento de funções,
  cujas execuções não podem se dar de
  forma concorrente.
              Exemplo 04
• Utilizar os métodos multuamente
  excludentes de um objeto como do tipo
  synchronized em Java.
• Utilizar os métodos wait( ) e notify( ) para
  bloquear e liberar, respectivamente, as
  threads.
• Escreva uma classe em Java chamada
  Semaforo que implente as primitiva P(s) e
  V(s).
                   Exemplo 5
• Utilização da Classe Semarofo para
  resolver o problema de Produtor-
  Consumidor:
  – Utilizar dois objetos (instâncias) da classe
    Semaforo.
     • s1 e s2
     • Valores iniciais: s1 = 1; s2 = 0;
         A interface Runnable
• Para utilizar multithreads em Java é necessário
  instanciar um objeto de uma classe que estende
  a classe básicaThread, certo?
• Uma vez que Java não possui herança múltipla,
  como eu posso utilizar um objeto, cuja classe já
  é derivada, como no caso da ClasseThread?
  – public class Filho extends Pai extends Thread {
  ……………….
  } // isto nao eh possivel em Java
         A interface Runnable
• A solução encontrada em Java foi a
  utilização de uma interface: Runnable
  – No caso, tem-se de implementar esta
    interface, que possui o método run( ).
  – public class Filho extends Pai implements Runnable
  – Ao implementar uma interface, a classe se capacita a
    ser tratada como se fosse um objeto do tipo da
    inteface implementada.
     • Se a classe Filho implementar a interface Runnable, ela
       pode ser tratada como tal.
          A interface Runnable
• Cria-se uma thread (Classe Thread),
  passando para o seu construtor uma
  referência do objeto que implementa a
  interface Runnable.
  –   Thread uma_Thread = new Thread(Runnable obj_thread)
  – Thread uma_Thread = new Thread(Runnable obj_thread,
                                   String nome_da_thread)
   Solução Baseada na Interface
            Runnable
                      Thread
Classe A




                               referência


Classe B
           Runnable
Solução Baseada em Herança da
        Classe Thread

 Thread




Classe B   instanciação

						
Related docs