Baixe o app para aproveitar ainda mais
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:
Compartilhar