Threads Sincronizadas

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 );
}

  &#125; 

}[/code]

[code]package Buffer;
import java.util.*;

public class SynchronizedBuffer extends Buffer{

public SynchronizedBuffer&#40;Queue fila&#41; &#123;
	super&#40;&#41;;
&#125;
private int buffer;
private boolean ocupado = false;

public synchronized void set&#40;int valor&#41;&#123;
	while &#40;ocupado&#41;&#123;
		try&#123;
			System.out.println&#40;&quot;produtor tenta escrever&quot;&#41;;
			displayState&#40;&quot;Buffer cheio. Produtor aguardando&quot;&#41;;
			wait&#40;&#41;;
		&#125;
		catch&#40;InterruptedException exception&#41;&#123;
			exception.printStackTrace&#40;&#41;;
		&#125;
	&#125;
buffer = valor;
ocupado = true;
displayState&#40;&quot;Produtor escreve &quot; + buffer&#41;;
notify&#40;&#41;;
&#125;
public synchronized int get&#40;&#41;&#123;
	while&#40;!ocupado&#41;&#123;
		try&#123;
			System.out.println&#40;&quot;Consumidor tenta escrever&quot;&#41;;
			displayState&#40;&quot;Buffer vazio, consumidor aguardando&quot;&#41;;
			wait&#40;&#41;;
			&#125;
		catch&#40;InterruptedException exception&#41;&#123;
			exception.printStackTrace&#40;&#41;;
		&#125;
	&#125;
	ocupado = false;
	int readValue = buffer;
	displayState&#40;&quot;Consumidor lê &quot;+ readValue&#41;;
	notify&#40;&#41;;
	return readValue;
&#125;
public void displayState&#40;String operation&#41;&#123;
	System.out.printf&#40;&quot;%-40s%d\t\t%b\n\n&quot;, operation, buffer, ocupado&#41;;
&#125;

}
[/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]