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 extiendeThready sobreescribimos el métodorun(). Este método contiene el código que se ejecutará en un hilo separado. - Iniciar el Hilo: En la clase
EjemploThread, creamos instancias deMiHiloy llamamos al métodostart()para comenzar la ejecución del hilo. Esto invoca el métodorun()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 claseMiRunnableque implementaRunnabley sobreescribimos el métodorun(). - Crear Hilos: En la clase
EjemploRunnable, pasamos una instancia deMiRunnableal constructor deThread. Luego, iniciamos los hilos llamando al métodostart().
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
- Propuestas de actividades avanzadas con XML, DTD, XPath y XSLT
- Apuntes extensos de XML y XSLT
- El momento IDEAL para impulsar tu FORMACIÓN y alcanzar tus Metas Académicas: LAS NAVIDADES.

- 20 ejercicios de funciones avanzadas en Python (al estilo de Ackermann)
- Cómo guardar una página web completa en MySQL con PHP (urlencode, BLOB y otras técnicas)
- 60 ejercicios de funciones recursivas en Python para la carrera de Informática
- SIMULACRO 2 – FP Programación de Videojuegos
- Simulacro de examen – FP Programación de Videojuegos
- ALERTA METEOROLÓGICA

ELIGE TU RED FAVORITA Y SÍGUENOS.
AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.
Contenido restringido





































































































































































































































































INFORMACIÓN SOBRE 







Comments are closed