Threads Sincronizadas

0 respostas
G
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!
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>();
	}
 }
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 );
	  } 
	 } 
 }
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 );
	  } 
	 
	  
	  } 
 }
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  "+ readValue);
		notify();
		return readValue;
	}
	public void displayState(String operation){
		System.out.printf("%-40s%d\t\t%b\n\n", operation, buffer, ocupado);
	}
}
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();
 }
}
Criado 6 de março de 2007
Respostas 0
Participantes 1