// Classe Consumidor.java

public class Consumidor extends Thread {
   private ObjetoBuffer um_Buffer;
   private Semaforo s1,s2;

   // Construtores do Consumidor thread object
   public Consumidor( ObjetoBuffer dado )
   {
      super( "Consumidor" );
      um_Buffer = dado;
   }

   public Consumidor( ObjetoBuffer dado, Semaforo sem1, Semaforo sem2 )
   {
      super( "Consumidor" );
      um_Buffer = dado;
      s1 = sem1;
      s2 = sem2;
   }

   // Thread Consumidor lerah o buffer 10 vezes em intervalos aleatorios
   
   public void run()
   {
      int valor, soma = 0;

      do {

         // dorme por um intervalo aleatorio
         try {
            Thread.sleep( (int) ( Math.random() * 3000 ) );
         }

         // Tratamento de excecao
         catch( InterruptedException exception ) {
            System.err.println( exception.toString() );
         }

         s2.P();  // bloqueio da thread consumidora
         valor = um_Buffer.lerBuffer();
         s1.V();  // liberacao do threads produtora
         soma += valor;

      } while ( valor != 10 );

      System.err.println(
         getName() + " terminou de consumir. Totalizou: " + soma);
   }

} 

// fim da classe Consumidor

/*
 *Fonte: http://www.dca.ufrn.br/~affonso/DCA2401/2004_1/programas.html 
 *Luiz Affonso H Guedes de Oliveira
*/