COMPARTE ESTE ARTÍCULO

La concurrencia en Java permite que múltiples partes de un programa se ejecuten simultáneamente, lo que es especialmente útil para tareas que requieren mucha computación o que deben esperar respuestas externas. En este artículo, aprenderás los conceptos básicos de hilos (Threads), interfaces Runnable, y cómo controlar la concurrencia usando semáforos (Semaphores) en Java, con ejemplos simples que ilustran cada concepto.

1. Hilos en Java (Thread)

¿Qué es un Hilo?

Un hilo es una unidad de ejecución dentro de un proceso. Java soporta la ejecución concurrente de múltiples hilos, lo que permite que un programa realice múltiples tareas al mismo tiempo.

Crear e Iniciar un Hilo

La clase Thread se utiliza para crear y controlar hilos. A continuación se muestra un ejemplo simple:

class MiHilo extends Thread {
    @Override
    public void run() {
        System.out.println("Hola desde el hilo: " + Thread.currentThread().getName());
    }
}

public class EjemploThread {
    public static void main(String[] args) {
        MiHilo hilo1 = new MiHilo();
        MiHilo hilo2 = new MiHilo();

        hilo1.start();
        hilo2.start();
    }
}

Explicación

  • Extender Thread: Creamos una clase que extiende Thread y sobreescribimos el método run(). Este método contiene el código que se ejecutará en un hilo separado.
  • Iniciar el Hilo: En la clase EjemploThread, creamos instancias de MiHilo y llamamos al método start() para comenzar la ejecución del hilo. Esto invoca el método run() en un nuevo hilo de ejecución.

2. Usando Runnable para Crear Hilos

¿Qué es Runnable?

Runnable es una interfaz funcional que representa una tarea que puede ser ejecutada por un hilo. La principal ventaja de usar Runnable es que puedes implementar la concurrencia sin necesidad de extender la clase Thread, lo que permite una mayor flexibilidad y herencia múltiple.

Crear e Iniciar un Hilo usando Runnable

Aquí tienes un ejemplo de cómo usar Runnable:

class MiRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Hola desde el hilo con Runnable: " + Thread.currentThread().getName());
    }
}

public class EjemploRunnable {
    public static void main(String[] args) {
        MiRunnable miRunnable = new MiRunnable();
        Thread hilo1 = new Thread(miRunnable);
        Thread hilo2 = new Thread(miRunnable);

        hilo1.start();
        hilo2.start();
    }
}

Explicación

  • Implementar Runnable: Creamos una clase MiRunnable que implementa Runnable y sobreescribimos el método run().
  • Crear Hilos: En la clase EjemploRunnable, pasamos una instancia de MiRunnable al constructor de Thread. Luego, iniciamos los hilos llamando al método start().

3. Controlando la Concurrencia con Semáforos (Semaphore)

¿Qué es un Semáforo?

Un semáforo es una herramienta de sincronización que permite controlar el acceso a recursos compartidos, limitando el número de hilos que pueden acceder a un recurso al mismo tiempo.

Ejemplo de Uso de un Semáforo

Vamos a usar un semáforo para controlar que solo dos hilos puedan acceder a un recurso compartido a la vez.

import java.util.concurrent.Semaphore;

class RecursoCompartido {
    public void usar() {
        System.out.println(Thread.currentThread().getName() + " está usando el recurso compartido.");
        try {
            Thread.sleep(1000); // Simula el uso del recurso
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " ha terminado de usar el recurso.");
    }
}

class HiloConSemaforo extends Thread {
    private Semaphore semaphore;
    private RecursoCompartido recurso;

    public HiloConSemaforo(Semaphore semaphore, RecursoCompartido recurso) {
        this.semaphore = semaphore;
        this.recurso = recurso;
    }

    @Override
    public void run() {
        try {
            semaphore.acquire();
            recurso.usar();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release();
        }
    }
}

public class EjemploSemaforoSimple {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(2);
        RecursoCompartido recurso = new RecursoCompartido();

        HiloConSemaforo hilo1 = new HiloConSemaforo(semaphore, recurso);
        HiloConSemaforo hilo2 = new HiloConSemaforo(semaphore, recurso);
        HiloConSemaforo hilo3 = new HiloConSemaforo(semaphore, recurso);

        hilo1.start();
        hilo2.start();
        hilo3.start();
    }
}

Explicación

  • Semaphore: Creamos un semáforo con 2 permisos (Semaphore semaphore = new Semaphore(2);). Esto permite que solo dos hilos accedan al recurso compartido simultáneamente.
  • Adquirir y Liberar Permisos: En la clase HiloConSemaforo, antes de acceder al recurso compartido, el hilo debe adquirir un permiso (semaphore.acquire()). Después de usar el recurso, el hilo libera el permiso (semaphore.release()), permitiendo que otro hilo lo use.

Conclusión

En este artículo, hemos explorado cómo usar Threads, la interfaz Runnable, y Semaphores en Java para manejar la concurrencia de manera eficiente. Los hilos permiten la ejecución paralela de tareas, Runnable ofrece una forma flexible de definir tareas concurrentes, y los semáforos controlan el acceso a recursos compartidos, evitando problemas como las condiciones de carrera. Con estos fundamentos, puedes empezar a construir aplicaciones concurrentes más robustas y eficientes en Java.


¿QUÉ TE HA PARECIDO EL ARTÍCULO? Danos tu opinión al final de la página.
Deja tu comentario y ayúdanos a crecer.


¡SÍGUENOS EN TUS REDES FAVORITAS!
AYUDANOS A CRECER Y QUE LLEGUEMOS A TODAS LAS PERSONAS QUE NOS NECESITANA. SÍGUENOS EN TUS REDES.
Entra AQUÍ y elíge donde seguirnos. 

 

 


NUESTRAS ÚLTIMAS PUBLICACIONES

AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.

Contenido restringido

Acceso de usuarios existentes
   
Registro de un nuevo usuario
*Campo necesario

Categories:

Tags:

Comments are closed

Estado de acceso
ESTADO DE ACCESO
TRADUCTORES
COMPARTENOS
error: CONTENIDO PROTEGIDO