Threads + send/receive!

Estou implementando um jogo de bingo com Threads. São 10 Threads do tipo jogador e 1 do tipo mesa.

Cada jogador inicialmete gera a sua cartela e avisa a mesa que esta pronto para iniciar o jogo. Quando todos informarem a mesa que estão prontos, esta sorteia um numero (pedra) e envia a todos os jogadores. Cada jogador confere a sua cartela com a pedra sorteada e assinala se acertou.Após a conferencia cada jogador envia para a mesa dizendo se fez bingo ou não. Novamente a mesa aguarda as mensagens de todas as threads jogadoras. nãon havendo ganhador, a mesa sorteia uma nova pedra e distribui. Quando um jogador envia uma mensagem aos jogadores qye bingou o jogo termina: a mesa envia uma mensagem aos jogadores comunicando o fim do jogo. O programa é implementado usando send/receive!!!

O problema na minha implementação é que quando as Threads recebem a notificação de que a mesa sorteou um numero o jogo não anda mais! Vou passar o codigo:

CLASSE que contem os valores do jogo

[code]public class RegMsg{
private int sender, pedra ;
private boolean bingo;
public RegMsg(){
//sender = 999;
bingo = false;
//pedra = 0;
}
public void setSender( int origem ){
sender = origem;
}
public void setBingo ( boolean bingo ){
this.bingo = bingo;
}
public void setPedra ( int pedra ){
this.pedra = pedra;
}
public int getSender(){
return sender;
}
public boolean getBingo(){
return bingo;
}
public int getPedra() {
return pedra;
}
}

[/code]

CLASSE que contem a mensagem

[code]public class Message {
RegMsg [] caixa;
boolean [] cxcheia;
int numthr;
public Message( int numthr ){
this.numthr = numthr;
caixa = new RegMsg [ numthr ];
cxcheia = new boolean[ numthr ];

	for ( int i= 0; i < numthr; i++ ){
		cxcheia[i] = false;
		caixa  [i] = new RegMsg();
	}
}
public synchronized void send ( int destino, RegMsg msg){
	try{
		while ( cxcheia [ destino ] )  wait();
		
		caixa   [ destino ] = msg;
		
		cxcheia [ destino ] = true;
		
		notifyAll();
		
	}catch ( Exception e ){ System.out.println(e); }
}
public synchronized RegMsg receive( int pid ){
	try{
		while (!cxcheia [ pid ]) wait();
		
		cxcheia [ pid ] = false;
		
		notifyAll();
		
		return ( caixa [ pid ] );
		
	} catch ( Exception e ){ System.out.println(e); }
	
	return null;
}

}
[/code]

ClASSE que imprime resultados

[code]public class Print {

	int i;
	public synchronized void cartela ( int jogador, int [] cartela ){
		   System.out.println();
		   System.out.println("========================================================== " );
		   System.out.println(">>>>> CARTELA JOGADOR:  " + jogador );
		   for( int i = 0; i < 10;  i++ ) System.out.print(" | "+ cartela [ i  ] );
		   System.out.println();
		   System.out.println("========================================================== " );
		
	}
	public synchronized void bingo ( int jogador ){
		   System.out.println(".....................................................................");
		   System.out.println(".....................................................................");
		   System.out.println("   >>>>>>  BINGO >>>  BINGO >>>   JOGADOR "+jogador+ "   >>>>>>>>>>>>>>>" );
		   System.out.println(".....................................................................");
		   System.out.println(".....................................................................");
	}
	public synchronized void pedra ( int pedra ){
		   System.out.println();
		   System.out.println("**********************************************************");
	       System.out.println("********          PEDRA SORTEADA: "+pedra+ "       ***************");
		   System.out.println("**********************************************************");
		   System.out.println();
	}

}
[/code]

CLASSE jogador

class Jogador extends Thread {
	
	static boolean fimDoJogo = false;
	int [] cartela;
	int id;
	Message message;
	RegMsg msg;
	
	int pedra;
	int pontos;
	
	boolean bin = false;
	
	Print p = new Print();
	
	Jogador(int id, Message ms){
		
		this.id = id;
		cartela = new int[10];
		
		for(int i = 0; i<10; i++){
			cartela[i] = (int)(1+Math.random()*30);
		}
		p.cartela(id, cartela);
		message = ms;
		pedra = 0;
		pontos = 0;
		msg = new RegMsg();
		
	}

    public void run(){
    	
    	message.send(10,msg);
    	while(!bin){
    		
    	
    		msg = message.receive(id);
    		
    		if(msg.getBingo()){
    		  p.bingo(id);
    		  bin=true;
    		}
    		else{
    		 
    		  pedra = msg.getPedra();
    		  //System.out.println(pedra);
    		   for(int i = 0; i<10; i++){
    			 if(cartela[i]==pedra){
    				pontos++;
    			 }
    		   }
    		   if(pontos==10){
    	    	  msg.setBingo(true);
    	    	  message.send(id,msg);
    	    	  p.bingo(id);
    	       }
    	    }   	        		
    	}
    }
}

CLASSE mesa

[code]
class Mesa extends Thread {

int numero;
Message message;
RegMsg msg = new RegMsg();

Print p = new Print();

boolean bingaram = false;
static boolean fimDoJogo = false;
int ped;
Mesa(Message m){
	message = m;
	//msg = r;
	numero = 0;
	ped = 0;
}

public void run(){

	   for(int i =0; i<10; i++)
		   msg = message.receive(10);
		    
	   while(!fimDoJogo){    
		    ped=(int)(1+Math.random()*30);
		    p.pedra(ped);
		    
		    msg.setPedra(ped);
		   			    
		 for(int i =0; i<10; i++){
		 
		    message.send(i,msg);
		    //System.out.println(i);
		 }   
		 for(int i =0; i<10; i++){
		 
		    msg = message.receive(10);
		     // System.out.println(i);
		    bingaram = msg.getBingo();
		    if(bingaram==true){
		    	
		    	msg.setBingo(true);
		    	fimDoJogo = true;
		    	for(int j =0; i<10; i++)
		    	   message.send(j,msg);
		    }
     	 }
    }	
}

}[/code]

CLASSE main

class Main {
	
public static void main(String [] args){

	
	Message message = new Message(11);
		
	Jogador [] jogador = new Jogador[10]; 
	
	Mesa mesa = new Mesa(message);
	
	for(int i =0; i<10; i++){
		jogador[i] = new Jogador(i,message);
		jogador[i].start();
		
	}
	mesa.start();
	
	}
}

Obrigado pela ajuda!!!