Ejemplo de hilos 1.
sábado, octubre 29, 2011 at 9:11AM
jcarmonaloeches
package es.scjp;


/**
 * Esta clase muestra los conceptos básicos de los hilos en Java Recordamos los
 * siguientes conceptos básicos: 1) Un hilo puede ser definido por la
 * implementación de la interfaz runnable y la implementación de su método run,
 * o bien por la extensión de una clase thread. 2) Un hilo tiene diferentes
 * estados durante su ciclo de vida, estos son los siguientes: new, runnable,
 * running y dead. 3) Un hilo necesita ser instanciado, y sólo puede ser
 * ejecutado una sola vez, con el método start. Si se intenta ejecutar de nuevo
 * dará una excepción de tipo RunTimeException
 *
 * @author jcarmonaloeches
 * @desarrolloj2ee (twitter)
 *
 */
public class HilosEnJavaParte1 {

    public static void main(String args[]) {
        Hilo1 hilo1 = new Hilo1();
        Thread hilo1Thread = new Thread(hilo1);
        System.out.println("Estado del hilo1 después de la creación "
                + hilo1Thread.getState());
        hilo1Thread.start();
        System.out.println("Estado del hilo1 después de la ejecución "
                + hilo1Thread.getState());
        /**
         * Detenemos la variable esta corriendo para finalizar el método run e
         * introducimos una pausa de 5 segundos
         */
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out
                .println("Estado del hilo1 después de finalizar el método run "
                        + hilo1Thread.getState());

        Hilo2 hilo2 = new Hilo2();
        System.out.println("Estado del hilo2 después de la creación");
        hilo2.start();
        System.out.println("Estado del hilo2 después de la ejecución");
        /**
         * Detenemos la variable esta corriendo para finalizar el método run e
         * introducimos una pausa de 5 segundos
         */
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out
                .println("Estado del hilo2 después de finalizar el método run "
                        + hilo1Thread.getState());
        /**
         * Intentamos invocar de nuevo al hilo: aquí sabemos que puede lanzarse
         * una excepción en tiempo de ejecución, y por lo tanto no debe ser
         * capturada
         */
        System.out
                .println("Intentamos ejecutar un hilo que quedó parado de nuevo");
        hilo2.start();

    }
}

/**
 * Los hilos pueden generarse de varias maneras. Una de ellas es implementando
 * el método runnable
 *
 * @author jaime
 *
 */
class Hilo1 implements Runnable {

    /**
     * Runnable nos obliga a redifinir el método run Este método imprime cada
     * tres segundos el nombre del hilo mientras la variable estaCorriendo así
     * lo indique
     */
    public void run() {
        try {
            Thread.sleep(500);
            System.out.println("EJECUTANDO...."
                    + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

/**
 * Otra opción es extendiendo de Thread y sobreescribiendo el método run
 *
 * @author jaime
 *
 */
class Hilo2 extends Thread {

    public void run() {
        try {
            Thread.sleep(500);
            System.out.println("EJECUTANDO...."
                    + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

En el ejemplo anterior hemos visto qué existen en Java dos posibilidades de definición de un hilo, bien implementado la interfaz runnable, bien extendiendo de Thread. En ambos casos, es necesario redefinir (en el caso de extender de Thread) o implementar (en el caso de implementar la interfaz Runnable) el método run. Dicho método nos permite realizar una ejecución de un hilo.

Los pasos a seguir para la creación de un hilo son los siguientes:

  1. Definimos una clase que implemente Runnable o extienda de Thread.
  2. Redefinimos o implementamos el método start.
  3. Más tarde, desde una clase principal, creamos una instancia del hilo.
  4. Para ejecutar la instancia del hilo llamamos a la ejecución de start.
  5. Si existen varios hilos en ejecución, la JVM se encargará de alternar dicha ejecución. Es bueno conocer que se pueden asignar prioridades de ejecución a los hilos, que van desde el 1 hasta el 10. Sin embargo, la asignación de estas prioridades no nos garantiza un orden de ejecución, por lo que es bueno conocer que no podemos asegurar la salida de un programa escrito en Java donde dos hilos compartan la ejecución. Es decir, la salida es NO PREVISIBLE en todos los casos (aunque a nivel práctico en ocasiones se pueda preveer la salida).
Article originally appeared on javaHispano (http://www.javahispano.org/).
See website for complete article licensing information.