Sincronizar varios metodos

Mansabora
22 de Enero del 2004
Hola a todos,

tengo un problema con la sincronizacion y por mas que pruebo formas de hacerlo no se realiza lo que quiero.

Les explico:

Tengo tres threads de los cuales uno realiza la conexion a Internet, otro comprueba que la conexion exista, y el ultimo comprueba que se ha finalizado la conexion. Estos Thread cuando se ejecutan escriben un evento en una jTable de otra clase que es un JFrame. No se si hasta el momento me están siguiendo.

Además tengo una clase principal que es la que llama al JFrame, que es el que instancia a los threads.
Ahora estoy probando a utilizar el metodo sleep desde la clase principal para controlar los métodos que instancian a los threads, pero no va muy bien.

Otra forma que he probado ha sido con wait y notifyAll, pero tampoco me ha ido muy bien.

Si alguien sabe o me puede indicar mas o menos un camino me ayudaría mucho.

Muchas gracias por ayudarme.


josefcoml
22 de Enero del 2004
Si lo que quieres es sincronizar hilos usa métodos sincronizados (es decir, para un método dado se pone el modificador de la siguiente forma: synchronized void nombreMetodo(..))
o la sentencia synchronized si quieres sincronizar el acceso a objetos de una clase que no fue diseñada para el acceso de múltiples hilos así:
synchronized(objeto){
// sentencias que quieras sincronizar
}. Por ejemplo,
synchronized(miHebra){
miHebra.compruebaConexion();
}

Mansabora
22 de Enero del 2004
Gracias.

Así tambien lo he probado, hice una clase con 3 metodos sincronizados (Conectar,Comprobar,Desconectar), a los cuales los llamaba desde su respectivos Thead, Iniciar_Conexion llamaba a Conectar,.... Y una clase que lanzaba estos tres Thread.

El problema llegaba cuando tenia que escribir en el JTAble del Frame, desde esta clase llamo a la clase que lanza los Thread. Bueno en conclusión, me lanzaba el que iniciaba la conexion, pero con los otros dos me daba NullPointer pq estos necesitan datos que les proporciona la conexion.

Los metodos son:

public synchronized void Conectar(){
try{
while((initconexion==false)&&(finconexion==true)){
wait();
}
}catch(InterruptedException ie){...}
// Añado el evento
initconexion=true;
notifyAll();
}

public synchronized void Comprobar(){
try{
while((initconexion==true)&&(conexion==false)){
wait();
}
}catch(InterruptedException ie){...}
// Añado el evento
conexion=true;
notifyAll;
}

public synchronized void Desconectar(){
try{
while((finconexion==false)&&(conexion==true)){
wait();
}
}catch(InterruptedException ie){...}
// Añado el evento
finconexion=true;
notifyAll();
}

Lo que queria es que estos metodos me proporcionasen la sincronizacion, pero para el caso de la comprobacion y desconexion lo hace mal, y no encuentro el error.

Luego estaba el problema del JTable, ya que estos eventos no los muestra, he instanciado un objeto jTable y creo que está todo bien, pero no se como solucionar lo que pasa.

Si alguien me puede decir que hago mal....
Muchas gracias de todos modos.

josefcoml
22 de Enero del 2004
Te da NullPointer porque la conexión, me da la impresión que por el while, no llega a salir del bucle. Prueba con un if.