No es un bug, es una característica no documentada

22/10/15

Procesos y servicios. Hilos

¿Qué es?

Es una secuencia de código en ejecución dentro del contexto de un proceso.

Diferencia con procesos


La diferencia entre un hilo y un proceso es que el proceso, al crear un hijo, se duplica y tiene su espacio de direcciones, compitiendo en igualdad de condiciones con el proceso padre. Sin embargo, en un hilo (o proceso ligero) lo que hace el proceso es crear un espacio de direcciones dentro de su espacio de direcciones, por lo que la pugna por competir por el tiempo de procesador se verá en “inferioridad de condiciones” respecto a un proceso padre – hijo.


Ventajas

Al tener un marco común es fácil crear una variable y que varios procesos accedan a él.

Desventajas

Le tocará menos tiempo de CPU que a un proceso padre – hijo.

Hilos en Java

En Java hay dos formas de implementar hilos.
Una es mediante la clase Thread y otra mediante la Interface Runnable. En cualquiera de los dos casos hay que implementar el método run(), que será el que contendrá la acción que debe realizar el hilo.

Aparte del método run() hay otros métodos dentro de la clase Thread que tendremos que usar:
  • start() Es el método que invocaremos para que se cree el hilo
  • stop() Para detener el hilo
  • sleep(long milisegundos) Duerme el hilo durante el tiempo pasado en milisegundos
  • yield() Hace que el hilo en ejecución deje la ejecución para permitir que otros hilos se ejecuten.



Ejemplo de código en Java

En el siguiente código vamos a ver una clase que herede de Thread (HiloEjemplo) donde estarán los métodos y propiedades que estimemos oportunos y que tendrá que implementar obligatoriamente el método run().
La segunda clase será la que contenga el código principal (Main). Creará un objeto de esta clase y será donde se lance el objeto.

ARCHIVO HILOEJEMPLO.JAVA

public class HiloEjemplo extends Thread {

     // Propiedades
     private int c; // Contador de cada hilo
     private int hilo;
         
     // Constructor
     public HiloEjemplo(int hilo){
          this.hilo = hilo;
          System.out.println("CREANDO HILO: " + hilo);
     }
    
     // Métodos
     public void run(){
          c = 0;
          while (c <= 5){
                System.out.println("Hilo: " + hilo + " C = " + c);
                c++;
          }
     } // fin del run
}

ARCHIVO MAIN.JAVA


public class Main {
     public static void main(String[] argrs){
          HiloEjemplo h = null;
         
          for (int i = 0; i < 3; i++){
                h = new HiloEjemplo(i+1); // Se crea el hijo
                h.start(); // Se inicia el hijo
          }
          System.out.println("3 HILOS CREADOS...");
         
     } // fin del main
} // fin de clase

Si pruebas a lanzar la ejecución varias veces verás que el resultado que se muestra por pantalla es variable. Esto es porque actualmente no controlamos el orden en el que los hilos entrán en la CPU.

Ejercicio. Crea dos clases (hilos) Java que extiendan la clase Thread. Uno de los hilos debe visualizar por pantalla en un bucle infinito la palabra TIC y el otro hilo la palabra TAC.
Dentro del bucle utiliza el método sleep() para que nos dé tiempo a ver las palabras que se imprimen cuando lo ejecutamos (tendrás que añadir un bloque try-catch para capturar la excepción InterruptedException). Crea después la clase Main que haga uso de los hilos anteriores. ¿Se visualizan los textos de forma ordenada (es decir TIC TAC TIC TAC TIC TAC…)?     

3 comentarios:

  1. la respuesta no estaria de mas eh?

    ResponderEliminar
    Respuestas
    1. Puedes ver todos los ejercicios resueltos en la sección de descargas, bajándote el libro Módulo de Programación de Servicios y Procesos DAM2 Sierra de Guara.

      Aquí no se publicó porque la idea es conseguir que cada uno practique.
      Gracias por comentar

      Eliminar