Según mi parecer, la salida por consola debería ser:
" Llamando a HILO1.metodo1() HILO2 esperando HILO1.metodo1() finalizado Llamando a HILO1.metodo1() HILO2 esperando HILO1.metodo1() finalizado .... "
Y esto repetido en bucle.
Dado que el metodo1() de HILO1 es NO síncrono, yo esperaba que HILO2 continuara con la siguiente instrucción, super.wait(), después de llamar a metodo1(), sin embargo éso no es lo que ocurre, si que HILO2 se queda esperando que finalice la tarea HILO1, imprimiendo lo siguiente por consola:
" Llamando a HILO1.metodo1() HILO1.metodo1() finalizado HILO2 esperando Llamando a HILO1.metodo1() HILO1.metodo1() finalizado HILO2 esperando .... "
Si alguien me puede decir cómo solucionarlo y a qué se debe me haría un gran favor. Tal vez sea una tontería, pero me trae de cabeza.
Hola a tod@s.
Espero que alguien me pueda solucionar el siguiente problema:
Supongamos que tenemos las siguientes clases:
public class HILO1 extends Thread
{
//Otros metodos y variables
public void run()
{
//
}
public void metodo1()
{
try
{
super.sleep( 3000L );
System.out.println( "HILO1.metodo1() finalizado" );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
public class HILO2 extends Thread
{
//Otros metodos y variables
private HILO1 h = new HILO1();
public HILO2( HILO1 h )
{
this.h = h;
}
public synchronized void run()
{
while( true )
{
System.out.println( "Llamando a HILO1.metodo1()" );
h.metodo1();
System.out.println( "HILO2 esperando" );
try
{
super.wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class prueba
{
public static void main(final String[] args)
{
(new Thread()
{
public void run()
{
HILO1 h1 = new HILO1();
h1.start();
HILO2 h2 = new HILO2( h1 );
h2.start();
do
{
try
{
super.sleep( 6000L );
synchronized ( h2 )
{
h2.notify();
}
}
catch( Exception e )
{
e.printStackTrace();
}
}
while( true );
}
}).start();
}
}
Según mi parecer, la salida por consola debería ser:
"
Llamando a HILO1.metodo1()
HILO2 esperando
HILO1.metodo1() finalizado
Llamando a HILO1.metodo1()
HILO2 esperando
HILO1.metodo1() finalizado
....
"
Y esto repetido en bucle.
Dado que el metodo1() de HILO1 es NO síncrono, yo esperaba que HILO2 continuara con la siguiente instrucción, super.wait(), después de llamar a metodo1(), sin embargo éso no es lo que ocurre, si que HILO2 se queda esperando que finalice la tarea HILO1, imprimiendo lo siguiente por consola:
"
Llamando a HILO1.metodo1()
HILO1.metodo1() finalizado
HILO2 esperando
Llamando a HILO1.metodo1()
HILO1.metodo1() finalizado
HILO2 esperando
....
"
Si alguien me puede decir cómo solucionarlo y a qué se debe me haría un gran favor. Tal vez sea una tontería, pero me trae de cabeza.
Un saludo.