Foros del Web » Programación para mayores de 30 ;) » Java »

problema con threads

Estas en el tema de problema con threads en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/01/2010, 20:20
 
Fecha de Ingreso: enero-2010
Mensajes: 1
Antigüedad: 14 años, 3 meses
Puntos: 0
problema con threads

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();
}
}
  #2 (permalink)  
Antiguo 28/01/2010, 03:07
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: problema con threads

Depende de si estás usando threads sincronizados.

Échale un vistazo a esto por si acaso.

http://perseo.cs.buap.mx/~danguer/pr...ual/node5.html

Aunque no me he puesto a fondo con los threads, seguramente, los que están colgados están esperando a que les llegue el mensaje de algún evento que se debe producir, y que por algún motivo no les llega, por eso mismo no hacen caso a otras notificaciones externas (es como pulsar el boton de encendido del pc cuando antes hay que conectar la alimentación).

Deberías ir poco a poco tratando de acotar donde se te produce el problema. Por si te vale te dejo esta guia de debugging.

http://www.digilife.be/quickreferenc...0debugging.pdf

Etiquetas: threads
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:26.