Introducción a la concurrencia en JAVA

¡Buenas! Hoy vamos a dar una pequeña introducción a los hilos y programación concurrente en el lenguaje JAVA 🙂

Bien, basicamente, dispondremos de lo siguiente:

– Una clase “Tarea” que implementará a Runnable, por lo que tendremos que sobrecargar el método Run (), éste método es el que se ejecuta al lanzar el hilo 🙂

– Otra clase “Ejecutor” que lanzará varios hilos de la clase Tarea

Bien, vamos al grano y veamos un ejemplo 🙂

Comenzamos con la clase “Tarea”, lo único que hará será imprimir su estado:

public class Tarea implements Runnable{

  //declaramos algunos atributos necesarios
  private int sleepTime;
  private String TaskName;

  //constructor por defecto
  public Tarea(){}
  
  //constructor sobrecargado
  public Tarea(int _sleep, String _name){
    sleepTime=_sleep;
    TaskName=_name;
  }

  public void run() {

    //Imprimimos por la salida estándar y mandamos el hilo a dormir
    System.out.println("Tarea "+taskName+" ha ido a dormir");
    Thread.sleep(sleepTime);
    
    //Cuando despierta, mostrarmos el estado por pantalla
    System.out.println("Tarea "+taskName+" a terminado de dormir");

  }

}

Puede que para ejecutar la función sleep, vuestro IDE, os pida encapsularlo en un try-catch 😉

Bien, ahora vamos con la clase “Ejecutor”:

public class Ejecutor {

public static void main () {

  //Creamos varias tareas
  Tarea task1=new Tarea("tarea 1");
  Tarea task2=new Tarea("tarea 2");
  Tarea task3=new Tarea("tarea 3");
        
  System.out.println("Empezando ejecución");
  
  //Este objeto será el encargado de lanzar los hilos, estaríamos creando una "piscina" o conjunto de hilos
  ExecutorService threadExecutor = Executors.newCachedThreadPool();
        
  //Lanzamos las diferentes tareas concurrentemente
  threadExecutor.execute(task1);
  threadExecutor.execute(task2);
  threadExecutor.execute(task3);
        
  //terminamos la ejecución del ejecutor
  threadExecutor.shutdown();
  System.out.println("Termina ejecución del ejecutor de hilos");

}

}

Hay que decir que la ejecución de estos hilos concurrentes es totalmente INDETERMINISTA, en el sentido de que da igual el orden en que los lances, cada uno se ejecutará cuando la CPU decida 🙂

Para Ejecutar el proyecto, podemos hacer que la clase Ejecutor sea principal, o crear otra Main y lanzar el ejecutor desde ella 🙂

Debería dar una salida parecida a esta:

Empezando ejecución
Tarea tarea 2 ha ido a dormir
Tarea tarea 3 ha ido a dormir
Tarea tarea 1 ha ido a dormir
Termina ejecución del ejecutor de hilos
Tarea tarea 3 a terminado de dormir
Tarea tarea 1 a terminado de dormir
Tarea tarea 2 a terminado de dormir

Vuelvo a repetir, es posible que os salga que la tarea 2 termina antes que la 3, por ejemplo, debido al carácter indeterminista de la ejecución 😉

Espero que os haya sido de ayuda.

HackSaludos!!

Anuncios

Acerca de Darkvidhck

Estudiante de ingeniería informática, haciendo mis pinitos como desarrollador web, programador, gamer y Linuxero. Aficionado a la seguridad. Eterno viciado al conocimiento.
Esta entrada fue publicada en Programación y etiquetada , , , , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s