Pages

Hilos de ejecución

Un hilo es una secuencia de instrucciones que está controlada por un scheduler que se comporta como un flujo de control secuencial.

Hablar de hilos es hablar sobre programación concurrente, lo cual da lugar a nuevas necesidades como son la sincronizacion entre hilos y acceso de forma segura a variables u objetos compartidos por un mismo sistema o hilo.

Los Threads tienen un ciclo de vida caracteristico, en el siguiente diagrama de estados se puede apreciar el ciclo.

Como podemos ver en el diagrama, los threads tienen 5 estados característicos.
  • new(Recien creado) - Justo cuando es creado el nuevo hilo, esto sucede al utilizar la palabra reservada new, la cual hace una llamada al constructor de la clase Thread y lo deja listo para su uso.

  • Runnable(Listo para ejecutar) - El hilo estará en estado new hasta el momento en el cual el metodo start() de dicho hilo sea llamado, una vez que este metodo es llamado el hilo pasa a estar en runnable y se puede ejecutar en forma concurrente si la computadora cuenta con varios procesadores ,o bien puede compartir el procesador con los procesos.
A partir de el estado runnable, el hilo puede tomar tres diferentes estados, y estos dependerán del uso que se le proporcione a el hilo.
  • waiting(esperando) - A veces los hilos tienen que esperar a que otros hilos terminen de ejecutarse para poder continuar ( dígase una Entrada/Salida de datos ) entonces si la computadora no dispone de mutiples procesadores solo 1 hilo puede estar en ejecución y para ello, manda a waiting a otro de los hilos que este ocupando el procesador. Ademas el hilo puede quedar en estado waiting si esta en espera de un lock ( usado para sincronizacion entre hilos ), y para volver a su estador de Runnable, puede liberar el candado, o con los metodos de notify/notifyall , aunque esto por lo general lo hacen las algunas librerías de clases ya incluidas en la API.

  • Time waiting( tiempo en espera ) - Este estado es muy parecido al anterior, pero con la diferencia que el mismo hilo se puede liberar, ya que solo queda en espera durante el tiempo que se le asigne. Para mejor referencia puede ver el metodo sleep() en la documentación de java, este metodo hace esperar el flujo de ejecución del hilo actual.

  • Terminated(Terminado) - El ultimo estado en el cual el hilo entra cuando ha terminado su tarea o cuando es cancelado.

Ahora que ya tenemos un poco de teoría sobre los Hilos, pasemos a programar unos cuantos.


En Java los Hilos de ejecución ya están implementados en java.lang.Thread por lo cual no es necesario importar el paquete para poder utilizarlo.

Existen dos formas de iniciar un Thread
- implementado la interface runnable
- heredando desde la misma clase Thread

Si se inicia un Thread implementando una interface runnable solo se necesita redefinir el metodo run() dentro de una clase.
vale la pena destacar que el metodo run() contiene todo lo que el hilo hará, dígase llamadas a otros métodos, creación de objetos, declaración de variables; es lo mismo que un método main.

La pequeña implementacion quedaria algo asi:


public class HiloRunnable implements Runnable{

 public void run(){

System.out.println("Hilo creado desde la interfaz runnable");

}

}


Ahora que ya hemos creado la parte runnable del nuestro hilo podemos crear un thread y pasarle como parámetro nuestro runnable

Este es el constructor de la clase Thread
Thread(Runnable threadOb, String threadName);

donde threadOb es una instancia de la clase que implementa Runnable y threadName es el nombre que le podemos dar para identificar el hilo.

Ahora veamos el siguiente código.

Y no puede faltar el método de prueba con main.

  Aqui esta el codigo


nos da como resultado lo siguiente:
Ahora implementando Thread mediante herencia:

Aqui esta el codigo



y esto obtendremos.



Algunos métodos extras de la clase Threads son:

Join() - el cual sirve para esperar a que el hilo actual termine, hace referencia a conectar uno tras otro los hilos.

sleep() - puedes pausar o terminar el código a ejecutar en el run del thread

yield() - para ser cortes y preguntar que hilo esta libre para ejecutarse, antes de volver a ejecutar el hilo yield.


Referencias:

http://www.reloco.com.ar/prog/java/threads.html
http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap7/comunica.html
http://www.ctr.unican.es/asignaturas/procodis_3_II/Doc/Procodis_3_01.pdfhttp://perseo.cs.buap.mx/~danguer/projects/curso_java/manual/node5.html
http://trevinca.ei.uvigo.es/~formella/doc/cd04/node37.html
Imagenes propias.

You liked this post? Subscribe via RSS feed and get daily updates.

1 comentarios:

  1. Gracias por el tutorial. ;D

Publicar un comentario