Fala Galera to com um problema em uma aplicação simples de THREADS eu tinha que fazer um Buffer usando uma Fila e implementar uma thread Produtora e Outra Consumidor depois sincroniza-la, ai fiz esses codigos quando fiz a produtora e consumidora deu ± certo agora ela nao ta sincronizando e da dando erro na consumidora, alguem pode ver onde esta o erro e ajudar a consertar valeu!
[code]package Buffer;
import java.util.*;
public class Buffer {
private Queue<Integer> fila;
public void put(int x){
fila.offer(x);
}
public int remove(){
return fila.poll();
}
public Buffer(){
fila = new LinkedList<Integer>();
}
}[/code]
[code]package Buffer;
public class Consumidor extends Thread {
private Buffer sharedBuffer;
private int vezes;
public Consumidor( Buffer shared, int vezes )
{
this.sharedBuffer = shared;
this.vezes = vezes;
}
public void run(){
for ( int i = 1; i <= vezes ; i++ ){
int elemento = sharedBuffer.remove();
System.out.println( "\nConsumidor"+ elemento );
}
}
}[/code]
[code]package Buffer;
public class Produtor extends Thread {
private Buffer sharedBuffer;
private int vezes;
public Produtor( Buffer shared, int vezes )
{
this.sharedBuffer = shared;
this.vezes = vezes;
}
public void run(){
for ( int i = 1; i <= vezes ; i++ ){
sharedBuffer.put(i);
System.out.println("\nProdutor"+i );
}
}
}[/code]
[code]package Buffer;
import java.util.*;
public class SynchronizedBuffer extends Buffer{
public SynchronizedBuffer(Queue fila) {
super();
}
private int buffer;
private boolean ocupado = false;
public synchronized void set(int valor){
while (ocupado){
try{
System.out.println("produtor tenta escrever");
displayState("Buffer cheio. Produtor aguardando");
wait();
}
catch(InterruptedException exception){
exception.printStackTrace();
}
}
buffer = valor;
ocupado = true;
displayState("Produtor escreve " + buffer);
notify();
}
public synchronized int get(){
while(!ocupado){
try{
System.out.println("Consumidor tenta escrever");
displayState("Buffer vazio, consumidor aguardando");
wait();
}
catch(InterruptedException exception){
exception.printStackTrace();
}
}
ocupado = false;
int readValue = buffer;
displayState("Consumidor lê "+ readValue);
notify();
return readValue;
}
public void displayState(String operation){
System.out.printf("%-40s%d\t\t%b\n\n", operation, buffer, ocupado);
}
}
[/code]
[code]package Buffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainBufferSincronizado
{
public static void main( String[] args )
{
ExecutorService aplicativo = Executors.newFixedThreadPool( 2 );
SynchronizedBuffer buffer = new SynchronizedBuffer(null);
aplicativo.execute( new Produtor( buffer, 100 ) );
aplicativo.execute( new Consumidor( buffer, 100 ) );
aplicativo.shutdown();
}
} [/code]