Un hilo -algunas veces llamado contexto de ejecucin o proceso ligero- es un flujo
de control secuencial dentro de un programa. Un nico hilo es similar a un programa secuencial; es decir, tiene un comienzo, una secuencia y un final, adems en cualquier momento durante la ejecucin existe un slo punto de ejecucin. Sin embargo, un hilo no es un programa; no puede correr por s mismo, corre dentro de un programa. Un hilo por si mismo no nos ofrece nada nuevo. Es la habilidad de ejecutar varios hilos dentro de un programa lo que ofrece algo nuevo y til; ya que cada uno de estos hilos puede ejecutar tareas distintas. Se conocen tambin como procesos ligeros. Un thread es un flujo de ejecucin secuencial dentro de un proceso. Un mismo proceso java puede tener. a). Un nico thread (el thread principal) y por tanto se le llama monotarea. b). Varios threads (por ejemplo el thread principal y el de gestin de eventos). Y por tanto se le llama monotarea. Casi todas las clases referentes al manejo de threads se encuentran en el paquete java.lang.*
Creacin de Hilos Existen dos modos de crear Hilos en Java Extender la clase Thread Implementar la interface Runnable
El primer modo consiste en 1. crear una nueva clase que hereda la clase Thread y redefinir el mtodo run(). (Este mtodo contendr el cdigo que va a ser ejecutado por el hilo)
2. Luego se instancian objetos de la clase derivada y se llama a su mtodo start(). (As se arrancan hilos que ejecutan el cdigo contenido en el mtodo run()) El paquete java.lang define una clase Thread que sirve para crear hilos. Veamos un ejemplo
Paso 1 Esta clase define el prototipo para presentar mensajes en pantalla cada x segundos. import java.awt.*; //definimos la clase Hilo derivada de la clase Thread //as podremos instanciar todos los hilos que queramos class Hilo extends Thread{ private String s; //para almacenar los mensajes private int pausa; //pausa antes de presentar el mensaje //Constructor, se indica el mensaje y la pausa public Hilo(String m, int p){ s = m; pausa = p; } //Definimos el mtodo run() similar al main()pero para Hilos //recordar el contenido de Mensaje1.java public void run(){ do{ try{ sleep (pausa*1000); }catch (InterruptedException e){ ; } System.out.println(s); }while (true); } } Paso 2 Esta clase hace uso de la clase Hilo y presenta dos mensajes en pantalla, uno cada 3 segundos y otro cada 5 segundos. import java.lang.*; public class Mensaje3 { public static void main(String args[]){ Hilo m1,m2; /instanciamos dos objetos de la clase Hilo String s1,s2; s1 = new String("Visite el portar miWeb.com"); s2 = new String("EL MEJOR PORTAR EN INTERNET!"); //creamos los hilos m1 y m2 m1 =new Hilo(s1,3); m2 =new Hilo(s2,5); //arrancamos los hilos m1.start(); m2.start(); } }
El otro modo de crear hilos es mediante la implementacin de la interfaz Runnable. Lo primero que nos preguntamos es por qu existe la posibilidad de crear hilos de otro modo? La respuesta es que el primer modo no satisface todas las necesidades que se nos puedan presentar. Como ejemplo tpico, nos puede interesar heredar de la clase Applet y a la vez emplear los servicios de threads. En Java no est permitida la herencia mltiple, al menos de clases, la forma de solucionar este problema es utilizando una interface (lo que sera una clase abstracta pura en C++) que permita que las clases que implementa la interface puedan ser utilizada por la clase Thread como base para crear un hilo. La interfaz utilizada se denomina Runnable.
Podemos utilizar dos formas de crear Hilos utilizando Applets: Una consiste es crear clases extendidas de Thread, que contendr el cdigo de ejecucin del hilo, donde pasamos al constructor una referencia al applet que crea los hilos mediante this, esto es lo que hemos hecho en AppletConcurrent.java
hilo1 = new HiloApplet(this,pausa1); hilo2 = new HiloApplet(this,pausa2); Otra forma consiste en colocar el cdigo de ejecucin del hilo en el mtodo run() del applet y crear los hilos como una instancia de la clase Thread. Esto es lo que hemos hecho en el applet appletConcurrent2.java Esta clase presenta dos mensajes en pantalla, uno cada 3 segundos y otro cada 5 segundos public class AppletConcurrent2 extends Applet implements Runnable { String mensaje; //almacena el mensaje a presentar String s1,s2; //almacena las dos cadenas para los dos mensajes int pausa1, pausa2, pausa; Thread hilo1,hilo2; Rectangle r; //coordenadas del marco del applet int fila=10; // fila inicial del primer mensaje
public void init(){ setFont(new Font("Dialog",Font.BOLD,14)); mensaje =""; s1 = new String("Visite el portal miWeb.com"); pausa1 = 3; s2 = new String("EL MEJOR PORTAL EN INTERNET!"); pausa2 = 5; hilo1 = new Thread(this); hilo2 = new Thread(this); hilo1.start(); hilo2.start();
} public void run(){ //obtiene el identificador del Thread do{ Thread tActual = Thread.currentThread(); if (hilo1 == tActual) { mensaje = s1;pausa = pausa1;} if (hilo2 == tActual) {mensaje = s2;pausa = pausa2;} try{ tActual.sleep (pausa*1000); }catch (InterruptedException e){ ; } repaint(); // repintar la zona de dibujo }while (true); } public void paint(Graphics g){ r = g.getClipBounds(); //obtener las coordenadas del marco del applet g.setColor(Color.blue); g.drawString(mensaje,20,fila); fila = fila+18; if (fila > r.height) fila=10; } //parada de los hilos al abandonar el documento html public void stop(){ hilo1 = hilo2 = null; } }
Como Funcionan http://panamahitek.com/multiprocesos-en-java-como-usar-hilosthreads/