Buscar

14POO aula09 doc02

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Produtor / Consumidor com sincronização 
 
Quando efetuamos a sincronização, os dados só serão consumidos após serem produzidos. 
Isto se dá porque se não for a vez do thread de trabalhar, ele entrará em espera sendo 
notificado quando o recurso estiver disponível. 
 
Para a sincronização, basta criar uma classe para que a área compartilhada seja sincronizada 
e faça o controle. As outras classes envolvidas não alteram. 
Veja o novo código: 
package comSinc; 
 
 
/** 
 * 
 * @author Eduardo 
 */ 
public class EsperaInteiroSincronizado { 
 private int inteiroCompartilhado = -1; 
 private boolean escrever=true; 
 
 /** 
 * @return the inteiroCompartilhado 
 */ 
 public synchronized int getInteiroCompartilhado() { 
 while(escrever){//não é a vez do consumidor 
 //a thread que chamou este método precisa esperar 
 try{ 
 wait(); 
 } 
 catch (InterruptedException exception){ 
 exception.printStackTrace(); 
 } 
 } 
 //indica que o produtor pode armazenar outro valor 
 //porque um consumidor acabou de recuperar o valor compartilhado 
 escrever = true; 
 
 //diz a uma thread em espera para se tornar pronta 
 notify(); 
 System.err.println(Thread.currentThread().getName()+ 
 " Recuperando InteiroCompartilhado "+ this.inteiroCompartilhado); 
 return inteiroCompartilhado; 
 } 
 
 /** 
 * @param inteiroCompartilhado the inteiroCompartilhado to set 
 */ 
 public synchronized void setInteiroCompartilhado(int inteiroCompartilhado) { 
 while(!escrever){ //não é a vez do produtor 
 //a thread que chamou este método precisa esperar 
 try{ 
 wait(); 
 } 
 catch (InterruptedException exception){ 
 exception.printStackTrace(); 
 } 
 } 
 
 System.err.println(Thread.currentThread().getName()+ 
 " Atribuindo para InteiroCompartilhado "+ inteiroCompartilhado); 
 // atribui um novo valor para área compartilhada 
 this.inteiroCompartilhado = inteiroCompartilhado; 
 //indica que o produtor não pode armazenar um outro valor 
 // até que o consumidor recupere o valor atual da área compartilhada 
 escrever=false; 
 // diz a uma thread em espera para se tornar pronta 
 notify(); 
 } 
 
} 
 
Neste exemplo, sempre teremos a mesma saída:

Outros materiais