domingo, 16 de mayo de 2010

Ejecutando Hilos, comparativa Java y C#

crab-icon javacrab-icon ball c# Hoy en The Code Crab vamos a ver como se ejecutan hilos, comparando el código en C# para ello con el código en Java. No obstante, no vamos a profundizar mucho en el tema, para mas información consultad las siguientes fuentes:

Pues sin mas preámbulos, empecemos con C#.

Ejecutar un metodo en un hilo paralelo es muy sencillo. Lo primero es que no se nos debe olvidar la instrucción using: “using System.Threading;”. Una vez tenemos el using definido correctamente debemos hacer el método que queremos que se ejecute en un hilo separado. No tiene por que ir en una clase separada, ni llevar nada especial, simplemente un método normal y corriente:

 public void HelloThread()
{
while (true)
{
Console.WriteLine("Hola desde el hilo " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(300);
}
}


Tras esto definiremos e invocaremos los hilos. Puede ser en cualquier método que se ejecute que tenga acceso al método que acabamos de definir. En mi caso, estoy haciendo un programa simple de ejemplo así que pondré el código en el constructor:




public Program()
{
//Creamos y lanzamos un hilo
Thread thr1 = new Thread(HelloThread);
thr1.Start();
//Creamos y lanzamos un segundo hilo
Thread thr2 = new Thread(HelloThread);
thr2.Start();
//Esperamos 5 segundos a que hagan cosas
Thread.Sleep(5000);
//Cerramos el primer hilo
thr1.Abort();
//Join une el hilo con el principal, haciendo así que se espere a que termine ordenadamente
thr1.Join();
//Cerramos y esperamos por el segundo hilo
thr2.Abort();
thr2.Join();
Console.WriteLine("Programa terminado ordenadamente");
}


Compilamos, ejecutamos, y … tachaaaaaaaaaan, funciona!



hilos1



Ha sido fácil, ¿verdad? Mucho, diría yo. Ahora veremos como seria hacer en Java este mismo programa.



Lo primero que tenemos que hacer es crear una clase que herede de Thread, implementando el método run, donde habrá que poner la lógica del hilo:



public class ThreadClass extends Thread {
private boolean thrbool = true;
public void run(){
//Repetimos el bucle hasta que thrbool este puesto a false
while(thrbool){
System.out.println("Hello from thread "+super.getId());
//Hay que hacer try catch para poder usar thread.sleep()
try{
Thread.sleep(300);
}catch(Exception e){}
}
}
//Metodo para poner thrbool a false
//Se podria utilizar el metodo .stop para forzar a cerrarse el hilo
//Pero esta deprecated, asi que mejor terminarlo todo ordenadamente
public void stopThread(){
thrbool = false;
}
}


Tras esto debemos hacer una clase principal que instancie los hilos:



public class MainClass{
public static void main(String args[]){
//Creamos y arrancamos 2 hilos diferentes
ThreadClass thr1 = new ThreadClass();
ThreadClass thr2 = new ThreadClass();
thr1.start();
thr2.start();
try{
Thread.sleep(5000);
}catch(Exception e){}
//Hacemos que se cierren ordenadamente.
thr1.stopThread();
thr2.stopThread();
}
}


Tenemos el método stop() equivalente a Abort() de C#, pero esta deprecated, así que deberíamos crear nuestro propio método para cerrar el hilo. Tras esto ya tenemos nuestro programa funcionando con diferentes hilos.



hilos2


EDIT: Dado que Java no permite herencia multiple, el uso de la clase base Thread no esta aconsejado, puesto que si queremos utilizar en otro hilo una clase que ya hereda de algo no podriamos. La solución a esto es implementar la interfaz Runnable, siendo por lo demas exactamente igual que heredar de Thread.

¿Que os ha parecido? Siendo sincero, es bastante fácil de hacer en ambos lenguajes, pero definitivamente en caso de tener que escoger definitivamente es mas fácil en C#, pues lo mas intuitivo es lanzar un método cualquiera en un hilo distinto, sin necesidad de crear una clase a parte. Así que esa es mi conclusión. ¡¡Hasta otra y sed buenos cangrejos!! image

2 comentarios: