La programación concurrente es un aspecto fundamental en el desarrollo de aplicaciones modernas, permitiendo a los programas realizar múltiples tareas de manera simultánea. Java ofrece potentes herramientas para manejar la concurrencia, entre ellas, los threads y los semáforos. En este artículo, te presento dos ejercicios prácticos que te ayudarán a entender mejor cómo funcionan estos conceptos en la práctica.
Ejercicio 1: Implementación de Threads
Enunciado:
Crea un programa en Java que simule un banco de pruebas de vehículos. En este escenario, tienes tres vehículos que necesitan ser sometidos a pruebas en tres pistas diferentes. Cada pista solo puede manejar un vehículo a la vez. El programa debe utilizar threads para simular que los vehículos acceden a las pistas, permanecen en ellas por un tiempo aleatorio, y luego se liberan. Cada thread debe imprimir un mensaje indicando cuándo el vehículo entra en la pista, cuánto tiempo pasa en ella, y cuándo la deja.
Código:
import java.util.Random;
class Vehiculo extends Thread {
private String nombre;
private int pista;
public Vehiculo(String nombre, int pista) {
this.nombre = nombre;
this.pista = pista;
}
@Override
public void run() {
try {
System.out.println(nombre + " entrando en la pista " + pista);
Random random = new Random();
int tiempoPrueba = random.nextInt(5000) + 2000; // Tiempo de prueba entre 2 y 5 segundos
Thread.sleep(tiempoPrueba);
System.out.println(nombre + " completó la prueba en la pista " + pista + " en " + (tiempoPrueba / 1000) + " segundos.");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public class BancoPruebas {
public static void main(String[] args) {
Vehiculo vehiculo1 = new Vehiculo("Vehículo 1", 1);
Vehiculo vehiculo2 = new Vehiculo("Vehículo 2", 2);
Vehiculo vehiculo3 = new Vehiculo("Vehículo 3", 3);
vehiculo1.start();
vehiculo2.start();
vehiculo3.start();
}
}
Resultado Esperado:
Al ejecutar el programa, verás una salida similar a esta (los tiempos pueden variar debido a la aleatoriedad):
Vehículo 1 entrando en la pista 1
Vehículo 2 entrando en la pista 2
Vehículo 3 entrando en la pista 3
Vehículo 2 completó la prueba en la pista 2 en 3 segundos.
Vehículo 1 completó la prueba en la pista 1 en 4 segundos.
Vehículo 3 completó la prueba en la pista 3 en 5 segundos.
Ejercicio 2: Uso de Semáforos
Enunciado:
Crea un programa en Java que simule un laboratorio de computación con cuatro computadoras. Hay seis estudiantes que necesitan usar las computadoras, pero solo cuatro pueden hacerlo al mismo tiempo. Utiliza semáforos para controlar el acceso de los estudiantes a las computadoras. Cada estudiante debe imprimir un mensaje cuando comienza a usar una computadora y otro cuando termina de usarla, indicando qué computadora estaba usando.
Código:
import java.util.concurrent.Semaphore;
class Estudiante extends Thread {
private String nombre;
private Semaphore semaforo;
public Estudiante(String nombre, Semaphore semaforo) {
this.nombre = nombre;
this.semaforo = semaforo;
}
@Override
public void run() {
try {
semaforo.acquire();
int computadora = semaforo.availablePermits() + 1; // Para identificar la computadora utilizada
System.out.println(nombre + " comenzó a usar la computadora " + computadora);
Thread.sleep((long) (Math.random() * 3000) + 2000); // Simula el tiempo de uso entre 2 y 5 segundos
System.out.println(nombre + " terminó de usar la computadora " + computadora);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaforo.release();
}
}
}
public class LaboratorioComputacion {
public static void main(String[] args) {
Semaphore semaforo = new Semaphore(4); // 4 computadoras disponibles
Estudiante estudiante1 = new Estudiante("Estudiante 1", semaforo);
Estudiante estudiante2 = new Estudiante("Estudiante 2", semaforo);
Estudiante estudiante3 = new Estudiante("Estudiante 3", semaforo);
Estudiante estudiante4 = new Estudiante("Estudiante 4", semaforo);
Estudiante estudiante5 = new Estudiante("Estudiante 5", semaforo);
Estudiante estudiante6 = new Estudiante("Estudiante 6", semaforo);
estudiante1.start();
estudiante2.start();
estudiante3.start();
estudiante4.start();
estudiante5.start();
estudiante6.start();
}
}
Resultado Esperado:
Al ejecutar el programa, verás una salida similar a esta (el orden puede variar debido a la concurrencia):
Estudiante 1 comenzó a usar la computadora 4
Estudiante 2 comenzó a usar la computadora 3
Estudiante 3 comenzó a usar la computadora 2
Estudiante 4 comenzó a usar la computadora 1
Estudiante 4 terminó de usar la computadora 1
Estudiante 5 comenzó a usar la computadora 1
Estudiante 2 terminó de usar la computadora 3
Estudiante 6 comenzó a usar la computadora 3
Estudiante 1 terminó de usar la computadora 4
Estudiante 3 terminó de usar la computadora 2
Estudiante 5 terminó de usar la computadora 1
Estudiante 6 terminó de usar la computadora 3
Conclusión
Estos ejercicios prácticos te proporcionan una introducción sólida a la programación concurrente en Java usando threads y semáforos. Los threads permiten ejecutar tareas en paralelo, mientras que los semáforos son esenciales para controlar el acceso concurrente a recursos compartidos, como en el caso del laboratorio de computación. Practicar con estos conceptos te ayudará a desarrollar aplicaciones más eficientes y escalables. ¡Sigue explorando y experimentando para mejorar tus habilidades de programación concurrente!
¿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