Ejemplo de Hilo en Java

Bienvenido al Ejemplo de Hilo en Java. Proceso y Hilo son dos unidades básicas de ejecución. La programación de concurrencia se preocupa más por los hilos en Java.

Proceso

A process is a self contained execution environment and it can be seen as a program or application. However a program itself contains multiple processes inside it. Java runtime environment runs as a single process which contains different classes and programs as processes.

Hilo

El hilo puede ser llamado proceso liviano. El hilo requiere menos recursos para crearse y existe dentro del proceso, compartiendo los recursos del proceso.

Ejemplo de Hilo en Java

Cada aplicación Java tiene al menos un hilo: el hilo principal. Aunque hay muchos otros hilos Java ejecutándose en segundo plano, como el manejo de memoria, el manejo del sistema, el procesamiento de señales, etc. Pero desde el punto de vista de la aplicación, el hilo principal es el primero y podemos crear múltiples hilos a partir de él. La programación multiproceso se refiere a dos o más hilos que se ejecutan concurrentemente en un solo programa. Un procesador de núcleo único de una computadora puede ejecutar solo un hilo a la vez y el reparto de tiempo es una característica del sistema operativo para compartir el tiempo del procesador entre diferentes procesos y hilos.

Beneficios de los hilos en Java

  1. Los hilos en Java son ligeros en comparación con los procesos, ya que tardan menos tiempo y recursos en crearse.
  2. Los hilos comparten los datos y el código de su proceso principal
  3. El cambio de contexto entre hilos suele ser menos costoso que entre procesos.
  4. La intercomunicación entre hilos es relativamente más fácil que la comunicación entre procesos.

Java proporciona dos formas de crear un hilo de forma programática.

  1. Implementando la interfaz java.lang.Runnable.
  2. Extendiendo la clase java.lang.Thread.

Ejemplo de hilo Java – implementando la interfaz Runnable

Para hacer que una clase sea ejecutable, podemos implementar la interfaz java.lang.Runnable y proporcionar la implementación en el método public void run(). Para usar esta clase como un hilo, necesitamos crear un objeto Thread pasando el objeto de esta clase Runnable y luego llamar al método start() para ejecutar el método run() en un hilo separado. Aquí hay un ejemplo de hilo en Java implementando la interfaz Runnable.

package com.journaldev.threads;

public class HeavyWorkRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            // Obtener conexión a la base de datos, eliminar datos no utilizados de la base de datos
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

Ejemplo de hilo Java – extendiendo la clase Thread

Podemos extender la clase java.lang.Thread para crear nuestra propia clase de hilo en Java y sobrescribir el método run(). Luego podemos crear su objeto y llamar al método start() para ejecutar nuestro método de ejecución de hilo personalizado. Aquí hay un ejemplo simple de hilo en Java que muestra cómo extender la clase Thread.

package com.journaldev.threads;

public class MyThread extends Thread {

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("MyThread - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            // Obtener conexión a la base de datos, eliminar datos no utilizados de la base de datos
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("MyThread - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }
    
}

Aquí hay un programa de prueba que muestra cómo crear un hilo en Java y ejecutarlo.

package com.journaldev.threads;

public class ThreadRunExample {

    public static void main(String[] args){
        Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
        Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
        System.out.println("Starting Runnable threads");
        t1.start();
        t2.start();
        System.out.println("Runnable Threads has been started");
        Thread t3 = new MyThread("t3");
        Thread t4 = new MyThread("t4");
        System.out.println("Starting MyThreads");
        t3.start();
        t4.start();
        System.out.println("MyThreads has been started");
        
    }
}

La salida del programa de ejemplo de hilo en Java anterior es:

Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1

Una vez que iniciamos cualquier hilo, su ejecución depende de la implementación del sistema operativo en cuanto a la partición del tiempo y no podemos controlar su ejecución. Sin embargo, podemos establecer la prioridad de los hilos, pero incluso así no garantiza que el hilo de mayor prioridad se ejecute primero. Ejecute el programa anterior varias veces y verá que no hay un patrón claro en el inicio y finalización de los hilos.

Ejecutable vs Hilo

Si su clase proporciona más funcionalidad además de simplemente ejecutarse como un hilo, debería implementar la interfaz Runnable para proporcionar una forma de ejecutarla como un hilo. Si el único objetivo de su clase es ejecutarse como un hilo, puede extender la clase Thread. La implementación de Runnable es preferible porque Java permite implementar múltiples interfaces. Si extiende la clase Thread, no puede extender ninguna otra clase. Consejo: Como habrá notado, el hilo no devuelve ningún valor, pero ¿qué pasa si queremos que nuestro hilo realice algún procesamiento y luego devuelva el resultado a nuestro programa cliente? Consulte nuestro Java Callable Future. Actualización: A partir de Java 8, Runnable es una interfaz funcional y podemos utilizar expresiones lambda para proporcionar su implementación en lugar de usar una clase anónima. Para obtener más detalles, consulte Interfaces Funcionales de Java 8.

Source:
https://www.digitalocean.com/community/tutorials/java-thread-example