Exercicio com Thread (Duvidas)

7 respostas
W

Olá pessoal eu estou com dificuldades pra rodar o código referente ao seguinte enunciado:

/*
 1) Desenvolva um aplicativo Java que crie duas threads que compartilham o mesmo objeto
* (espaço na memória). A primeira thread deve gravar a cada 2 segundos nesse objeto um
* número aleatório entre 1 e 3000. A segunda thread deve ler esse valor armazenado no
* objeto compartilhado e entrar no estado de espera cronometrado, no qual o tempo de
* espera deverá ser o valor lido em milisegundos.
*
* Todos os valores escritos pela primeira thread deve ser lidos pela segunda, portanto,
* caso a segunda thread ainda esteja no estado de espera, a primeira não pode escrever
* nenhum valor no objeto compartilhado.
*
* Esse processo de escrita e leitura deve ocorrer 5 vezes cada, ou seja, a primeira
* thread deve escrever 5 vezes um número no objeto compartilhado e a segunda thread
* deve ler esses 5 valores.
 */

Abaixo segue meu código, gostaria de possiveis soluções, pois meu código não está rodando e como sou novo no java não sei onde estou errando,  pesquisei muito antes de posta-lo aqui, desde  agradeço....

package thread;


import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;

        public class Tarefa04 implements Buffer
        {
           

           // Bloqueio para controlar sincronização com esse buffer
           private Lock bloquearAcesso = new ReentrantLock();

           // condições para controlar leitura e gravação
           private Condition canGrava = bloquearAcesso.newCondition();
           private Condition canLer = bloquearAcesso.newCondition();
           private static Random gerador= new Random();
           private int objeto = -1; // compartilhado pelas threads producer e consumer
           private boolean ocupada = false; // se o buffer estiver ocupado
           int i;
           // coloca o valor int no buffer
            
           public  void set( int n )
                   

           {
               for(i=0;i<=5;i+=1)
               bloquearAcesso.lock(); // bloqueia esse objeto

              // envia informações de thread e de buffer para a saída, então espera

              try
              {
                 // enquanto o buffer não estiver vazio, coloca thread no estado de espera
                 while ( ocupada )
                 {
                    System.out.println( "Thread Tentando Escrever." );
                    displayState( "Buffer cheio.Thread Então espera." );
                    canGrava.await(); // espera até que o buffer esteja vazio
                 } // end while

                 objeto = n; // configura novo valor de buffer

                 // indica que a produtora não pode armazenar outro valor
                 // até a consumidora recuperar valor atual de buffer
                 ocupada = true;

                 displayState( "Thread escreve " + objeto );

                 // sinaliza a thread que está esperando para ler a partir do buffer
                 canLer.signal();
              } // fim do try
              catch ( InterruptedException exception )
              {
                 exception.printStackTrace();
              } // fim do catch
          finally
              {
              bloquearAcesso.unlock(); // desbloqueia esse objeto
              } // fim do finally
           } // fim do método set

           // retorna valor do buffer
           public int get()
           {
              int readValue = 0; // inicializa de valor lido a partir do buffer
              bloquearAcesso.lock(); // bloqueia esse objeto
              // envia informações de thread e de buffer para a saída, então espera
              try
              {
                 // enquanto os dados não são lidos, coloca thread em estado de espera
                 while ( !ocupada )
                 {
                    System.out.println( "Thread Tenta ler." );
                    displayState( "Buffer vazio.Thread Espera." );
                    canLer.await(); // espera até o buffer tornar-se cheio
             } // fim do while

                 // indica que a produtora pode armazenar outro valor
                 // porque a consumidora acabou de recuperar o valor do buffer
                 ocupada = false;

                 readValue = objeto; // recupera o valor do buffer
                 displayState( "Thread lê " + readValue );
                 // sinaliza a thread que está esperando o buffer tornar-se vazio
                 Thread.sleep( gerador.nextInt( 2000 ) ); // thread sleep
                 canGrava.signal();
              } // fim do try
              // se a thread na espera tiver sido interrompida, imprime o rastreamento de pilha
              catch ( InterruptedException exception )
              {
                 exception.printStackTrace();
              } // fim do catch
              finally
              {
                  bloquearAcesso.unlock(); // desbloqueia esse objeto
              } // fim do finally

              return readValue;
           } // fim do método get

           // exibe a operação atual e o estado de buffer
           public void displayState( String operation )
           {
              System.out.printf( "%-40s%d\t\t%b\n\n", operation, objeto,
                      ocupada );
       } // fim do método displayState
        } // fim da classe SynchronizedBuffer
--------------------------------------------------------------------------
Em seguida a classe Buffe que criei


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package thread;

		// Fig. 23.6: Buffer.java
		// Interface Buffer especifica métodos chamados por Producer e Consumer.

		public interface Buffer
		{
		   public void set( int n ); // coloca o valor int no Buffer
		   public int get(); // retorna o valor int a partir do Buffer
		} // fim da interface Buffer
--------------------------------------------------------------------------------------------------
Logo mais a classe rad para gerar um numero aleatorio...

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package thread;

import java.util.Random;

/**
 *
 * @author Warley
 */
class rand {

Random rand = new Random();
int n = rand.nextInt(30) + 10;
}

7 Respostas

d34d_d3v1l

códigos sem formatação são impossíveis de ler… doi até os olhos… em alguns casos, dá até dor de cabeça…

Por favor, formate o código usando a tag code ao escrever a mensagem no tópico… é uma boa prática…

L

vamos analisar!

package thread; 


import java.util.Random; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 
import java.util.concurrent.locks.Condition; 

public class Tarefa04 implements Buffer 
{ 


// Bloqueio para controlar sincronização com esse buffer 
private Lock bloquearAcesso = new ReentrantLock(); 

// condições para controlar leitura e gravação 
private Condition canGrava = bloquearAcesso.newCondition(); 
private Condition canLer = bloquearAcesso.newCondition(); 
private static Random gerador= new Random(); 
private int objeto = -1; // compartilhado pelas threads producer e consumer 
private boolean ocupada = false; // se o buffer estiver ocupado 
int i; 
// coloca o valor int no buffer 

public void set( int n ) 


{ 
for(i=0;i<=5;i+=1) 
bloquearAcesso.lock(); // bloqueia esse objeto 

// envia informações de thread e de buffer para a saída, então espera 

try 
{ 
// enquanto o buffer não estiver vazio, coloca thread no estado de espera 
while ( ocupada ) 
{ 
System.out.println( "Thread Tentando Escrever." ); 
displayState( "Buffer cheio.Thread Então espera." ); 
canGrava.await(); // espera até que o buffer esteja vazio 
} // end while 

objeto = n; // configura novo valor de buffer 

// indica que a produtora não pode armazenar outro valor 
// até a consumidora recuperar valor atual de buffer 
ocupada = true; 

displayState( "Thread escreve " + objeto ); 

// sinaliza a thread que está esperando para ler a partir do buffer 
canLer.signal(); 
} // fim do try 
catch ( InterruptedException exception ) 
{ 
exception.printStackTrace(); 
} // fim do catch 
finally 
{ 
bloquearAcesso.unlock(); // desbloqueia esse objeto 
} // fim do finally 
} // fim do método set 

// retorna valor do buffer 
public int get() 
{ 
int readValue = 0; // inicializa de valor lido a partir do buffer 
bloquearAcesso.lock(); // bloqueia esse objeto 
// envia informações de thread e de buffer para a saída, então espera 
try 
{ 
// enquanto os dados não são lidos, coloca thread em estado de espera 
while ( !ocupada ) 
{ 
System.out.println( "Thread Tenta ler." ); 
displayState( "Buffer vazio.Thread Espera." ); 
canLer.await(); // espera até o buffer tornar-se cheio 
} // fim do while 

// indica que a produtora pode armazenar outro valor 
// porque a consumidora acabou de recuperar o valor do buffer 
ocupada = false; 

readValue = objeto; // recupera o valor do buffer 
displayState( "Thread lê " + readValue ); 
// sinaliza a thread que está esperando o buffer tornar-se vazio 
Thread.sleep( gerador.nextInt( 2000 ) ); // thread sleep 
canGrava.signal(); 
} // fim do try 
// se a thread na espera tiver sido interrompida, imprime o rastreamento de pilha 
catch ( InterruptedException exception ) 
{ 
exception.printStackTrace(); 
} // fim do catch 
finally 
{ 
bloquearAcesso.unlock(); // desbloqueia esse objeto 
} // fim do finally 

return readValue; 
} // fim do método get 

// exibe a operação atual e o estado de buffer 
public void displayState( String operation ) 
{ 
System.out.printf( "%-40s%d\t\t%b\n\n", operation, objeto, 
ocupada ); 
} // fim do método displayState 
} // fim da classe SynchronizedBuffer 
-------------------------------------------------------------------------- 
Em seguida a classe Buffe que criei 


/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package thread; 

// Fig. 23.6: Buffer.java 
// Interface Buffer especifica métodos chamados por Producer e Consumer. 

public interface Buffer 
{ 
public void set( int n ); // coloca o valor int no Buffer 
public int get(); // retorna o valor int a partir do Buffer 
} // fim da interface Buffer 
-------------------------------------------------------------------------------------------------- 
Logo mais a classe rad para gerar um numero aleatorio... 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package thread; 

import java.util.Random; 

/** 
* 
* @author Warley 
*/ 
class rand { 

Random rand = new Random(); 
int n = rand.nextInt(30) + 10; 
}
ViniGodoy

Não adianta nada recolocar o código, sem colocar também a indentação.

ViniGodoy

Warley, quando for postar código:

  1. Use a tag code, como descrito aqui: http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor
  2. Poste somente os trechos de código relevantes. Dificilmente alguém para para ler classes inteiras;
  3. Poste as mensagens de erro, ou explique porque você considera que não está rodando;
W

Ok, obrigado pela dica, sou novo no GUJ…

J

Os Links abaixo são exemplos de classes do clássico Produtor / Consumidor / ProdutorConsumidor.
Usando Semaphore.
O .jar está disponível aqui:
http://www.inf.furb.br/~jvzunino/jars/SimuladorLinhaProducao_JeanVictor.jar

http://code.google.com/p/bccjeanvictorzunino/source/browse/trunk/L101N1F21/src/Armazem.java

http://code.google.com/p/bccjeanvictorzunino/source/browse/trunk/L101N1F21/src/Processo.java

http://code.google.com/p/bccjeanvictorzunino/source/browse/trunk/L101N1F21/src/Consumidor.java

http://code.google.com/p/bccjeanvictorzunino/source/browse/trunk/L101N1F21/src/Produtor.java

http://code.google.com/p/bccjeanvictorzunino/source/browse/trunk/L101N1F21/src/ConsumidorProdutor.java

Tenho outros exemplos usando Condition e Lock mas estão em casa.

Espero ter ajudado,

Vlw Abraço.

W

Estou contando com a experiencia de todos, todas as respostas estão sendo absorvidas e estudada, agradeço a todos q estão contribuíndo e os que irão contribuir.

Criado 28 de janeiro de 2011
Ultima resposta 28 de jan. de 2011
Respostas 7
Participantes 5