11

Uso de hilos en Java(parte 1)

Una de las características principales de Java es que soporta la concurrencia(creación de varios procesos), esta característica se requiere para conseguir paralelismo(ejecución de distintos procesos de forma simultánea) y con ello obtener tiempos de ejecución menor en comparación a las ejecuciones que se realizan de forma secuencial, la ejecución secuencial se tiene de forma predeterminada al ejecutar un programa, esto se debe a que el sistema operativo creará un proceso que tendrá como objetivo procesar el programa en Java que has desarrollado.
Antes de continuar es necesario que sepas que todas las aplicaciones que utilizas en tu ordenador son gestionadas por el sistema operativo por medio de procesos, y el sistema operativo decidirá como gestionarlos y procesarlos(a través de los núcleos del procesador), con esto en mente ya entenderás porque el siguiente programa en Java(que calcula sumatorios y los almacena en un vector) se ejecuta de forma secuencial:

public class secuencial {

  static long vector[];

  public static int sumatorio(int n) {
    int resultado = 0;for (int i = 0; i < n; ++i) {
      resultado += i;
    }
    return resultado;
  }

  public static void main(String[] args) {
    /*
     * Este es un ejemplo de ejecución secuencial. Tendremos solo UN proceso para la
     * toda la ejecución del programa.
     */
    long start = System.currentTimeMillis();int N = 200000;
    vector = new long[N];// Calculo del sumatorio de cada indice y guardado en el vector.for (int i = 0; i < vector.length; ++i) {
      vector[i] = sumatorio(i);
    }
    long end = System.currentTimeMillis();System.out.println("Elapsed time = " + (end - start));
  }
}

El programa muestra por salida la cantidad de tiempo que ha necesitado para llevar a cabo su ejecución, ¿es esta la mayor rapidez que podemos tener? La respuesta es no, podemos utilizar más procesos que tendrán una carga de trabajo particionada, aquí es donde entra en juego la concurrencia y el paralelismo, en el siguiente tutorial te mostraré ambos escenarios de forma gráfica.

Ahora para poder emplear el uso de la concurrencia en Java es necesario crear una clase que cumpla con una de estas dos condiciones:

  • Heredar de la clase Thread.
  • Implementar la interfaz Runnable.

Os voy a poner un ejemplo de ambos casos:

//Ejemplo heredando de Thread

publicclassExampleThreadextendsThread{
  privateint idProcess;

  publicExampleThread(int id){
    this.idProcess = id;
  }

  // Es necesario implementar este metodo.
  publicvoidrun(){
    System.out.println("Thread number " + this.idProcess + " says hello");
  }

  publicstaticvoidmain(String[] args){
    // Creamos instancias de la clase que hereda.
    ExampleThread process1 = new ExampleThread(1);
    ExampleThread process2 = new ExampleThread(2);
    ExampleThread process3 = new ExampleThread(3);
    ExampleThread process4 = new ExampleThread(4);// Ahora podemos lanzar la ejecución usando el método start()
    process1.start();
    process2.start();
    process3.start();
    process4.start();
  }
}

//Ejemplo de Runnable
publicclassExampleRunnableimplementsRunnable{
  privateint idProcess;

  publicExampleRunnable(int id){
    this.idProcess = id;
  }

  // Es necesario implementar este metodo.
  publicvoidrun(){
    System.out.println("Thread number " + this.idProcess + " says hello");
  }

  publicstaticvoidmain(String[] args){
    // Para utilizar el constructor de Thread es necesario pasar como argumento una// instancia de la clase que implementa Runnable.
    ExampleRunnable target1, target2, target3, target4;
    Thread process1, process2, process3, process4;// Creamos instancias de la clase que implementa Runnable.
    target1 = new ExampleRunnable(1);
    target2 = new ExampleRunnable(2);
    target3 = new ExampleRunnable(3);
    target4 = new ExampleRunnable(4);// Creamos las instacias de Thread.
    process1 = new Thread(target1);
    process2 = new Thread(target2);
    process3 = new Thread(target3);
    process4 = new Thread(target4);// Ahora podemos lanzar la ejecución usando el método start()
    process1.start();
    process2.start();
    process3.start();
    process4.start();
  }
}

Si ejecutas varias veces los códigos anteriores podrás observar que el orden de saludos no siempre es el mismo, esto se debe a que los 4 subprocesos se ejecutan en un orden que no es determinable.

Continuaré con la explicación sobre hilos en Java en tutoriales posteriores.

Escribe tu comentario
+ 2
Ordenar por:
3
5 años

muy buen aporte andaba buscando justo como usar hilos pero me gustaría que hicieran un curso de programación concurrente con java

1
13092Puntos
5 años

Muchas gracias Mario, voy a seguir con los tutoriales de concurrencia, cualquier duda que tengas siéntete libre de enviarme un mensaje y te trataré de ayudar, un saludo!

2
12644Puntos
4 años

Excelente aporte, justo ando en mi curso de Programación Paralela y Distribuida de la Universidad y esto me ahorrará bastante tiempo!

1
18273Puntos
8 meses

Gracias por el aporte. Andaba buscando justo algo de hilos en java. 『☕』