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 extiendeThread
y 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 deMiHilo
y 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 claseMiRunnable
que implementaRunnable
y sobreescribimos el métodorun()
. - Crear Hilos: En la clase
EjemploRunnable
, pasamos una instancia deMiRunnable
al 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
- Las maravillas de las ciencias biológicas según la Academia SanRoque
- La motivación en Academia SanRoque
- Los docentes también se divierten.
- Comandos Principales en MongoDB y sus Equivalentes en Java
- Las bondades de escribir y leer cada día: herramientas esenciales para la vida académica, empresarial y social
- Immanuel Kant: Disertación contra las IA
- Forma Normal de Boyce-Codd (FNBC) en Bases de Datos
- Las Formas Normales en Bases de Datos
- La importancia de rodearte de personas virtuosas para alcanzar tus metas
ELIGE TU RED FAVORITA Y SÍGUENOS.
AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.
Contenido restringido
Comments are closed