si alguien es tan amable de decirme cual es mi error..
el algoritmo recorre una matriz como laberinto, va cargando las casillas recorridas en una lista y al llegar a la salida quiero imprimir la lista que corresponde a ese thread, implemente una exclusion pero en wait quedan colgados algunos threads y no despiertan al usar notifyAll(en el metodo run de la clase thread), soy nuevo en java y no lo entiendo muy bien (prefiero ver punteros C RULES!!) por favor si alguien entiende cual es mi error y puede ayudarme..
class Nodo{
public int x;
public int y;
public Nodo next;
public Nodo(int n, int m){
x=n;
y=m;
next=null;
}
}
class Lista{
public Nodo start; // Primer nodo de la lista
//Añade un nodo al final de la lista.
public void add(int N, int M){
Nodo aux=start;
// Si la lista esta completamente vacia
if(aux==null){
// Creamos el primer elemento
start=new Nodo(N,M);
}else{
// En caso contrario buscamos el ultimo y lo añadimos
while(aux.next!=null) {
aux=aux.next;
}
aux.next=new Nodo(N,M);
}
}
public void copy(Lista destino){
Nodo aux=start;
while(aux!=null){
destino.add(aux.x,aux.y);
aux=aux.next;
}
}
public void print(){
Nodo aux=start;
while(aux!=null){
System.out.println(aux.x+","+aux.y);
aux=aux.next;
}
}
}
class Hilo extends Thread {
int x,y;
Lista lista;
static int g;
private static boolean disponible=true;
static int maze[][]={{0,1,1,1,1,1,1,1},
{0,0,1,1,0,0,1,1},
{1,0,0,0,0,0,1,1},
{1,0,1,1,0,0,0,1},
{1,0,0,0,0,1,0,1},
{1,1,1,0,1,1,0,2},
{1,1,1,0,0,1,1,1}};
public Hilo(int x, int y, Lista lista){
this.x=x;
this.y=y;
this.lista = new Lista();
lista.copy(this.lista);
}
/*Verifica que las coordenadas dadas como parametro sean de las de una posicion valida*/
static boolean check(int x,int y, Lista path){
//si las coordenadas estan fuera de los limites de la matriz
//la posicion no es valida
if(((x<0)||(x>=7))||((y<0)||(y>=8)))
return false;
//si las coordenadas pertenecen a las de un muro la posicion no es valida
if(maze[x][y]==1)
return false;
//Buscamos las coordenadas en la lista de camino recorrido
Nodo aux=path.start;
while(aux!=null){
if((aux.x==x)&&(aux.y==y))
return false;
else
aux=aux.next;
}
return true;
}
public synchronized void run(){
//setPriority(1);
//Verifica si las coordendas son validas
if(check(x,y,lista)){
lista.add(x,y);
if(maze[x][y]==2){
g++;
//setPriority(10);
if(!disponible){
try{
System.out.println("esperando");
wait();
}catch(InterruptedException e){}
}
disponible=false;
System.out.println("camino "+g);
lista.print();
System.out.println("salida");
System.out.println();
disponible=true;
notifyAll();
return;
}
Hilo nuevo0 = new Hilo(x , y-1,lista);
Hilo nuevo1 = new Hilo(x+1, y ,lista);
Hilo nuevo2 = new Hilo(x , y+1,lista);
Hilo nuevo3 = new Hilo(x-1, y ,lista);
nuevo0.start();
nuevo1.start();
nuevo2.start();
nuevo3.start();
}
}
}
class Main2 {
public static void main(String args[] ) {
Lista lista = new Lista();
Hilo partida = new Hilo(0,0,lista);
partida.start();
}
}