Programación concurrente
Índice
- Creación de hilos básicos
- Pares e impares
- Cuenta bancaria
- Lectores y escritores
- Sistema de reservas de asientos en un cine
- Cola sincronizada
- Suma en paralelo
- Productor-Consumidor
- Problema de los filósofos cenando
Creación de hilos básicos
-
Escribir un programa que cree un hilo extendiendo la clase
Thread
y otro hilo implementando la interfazRunnable
. Ambos hilos deben imprimir mensajes en la consola en un ciclo infinito. Observar el orden en que se imprimen los mensajes. -
Modificar el programa anterior para que los hilos compartan el acceso a una variable de tipo
int
. Ambos hilos deben, en un ciclo infinito, imprimir el valor actual de la variable y luego incrementarla.Observar el comportamiento. Agregar bloques
synchronized
donde corresponda para asegurar que el comportamiento es correcto.
Pares e impares
Escribir un programa que utiliza 2 threads, uno imprimiendo números pares y el otro números impares, alternándose desde 1 hasta un número dado. Implementar sincronización utilizando Locks y Conditions para asegurar que los números se imprimen en el orden correcto.
Cuenta bancaria
Sean las clases CuentaBancaria
y Transaccion
. ¿Es la implementación thread-safe? Si deseamos ejecutar muchas transacciones en paralelo, ¿qué modificaciones habría que hacer? Implementar una simulación con N cuentas y M transacciones ejecutándose en T threads.
public class CuentaBancaria {
private int saldo;
public int verSaldo() { return saldol }
public void depositar(int cantidad) { saldo += cantidad; }
public void extraer(int cantidad) { saldo -= cantidad; }
}
public class Transaccion {
private final CuentaBancaria origen;
private final CuentaBancaria destino;
private final int cantidad;
public void ejecutar() {
origen.extraer(cantidad);
destino.depositar(cantidad);
}
}
Lectores y escritores
Modificar la implementación del ejercicio anterior para asegurar que varios lectores pueden acceder en paralelo a verSaldo
, pero solo un escritor puede acceder a depositar
o extraer
, y ningún lector puede acceder mientras un escritor está escribiendo.
Sistema de reservas de asientos en un cine
Diseñar un sistema donde múltiples usuarios pueden reservar asientos en un cine, en forma concurrente. Sincronizar correctamente para garantizar que dos usuarios no reserven el mismo asiento al mismo tiempo.
Cola sincronizada
Implementar una clase ColaSincronizada
, que recibe como parámetro un número entero N indicando su capacidad máxima. Si la cola está llena, el método encolar
debe bloquear hasta que haya lugar y el elemento haya sido encolado satisfactoriamente. Si la cola está vacía, desencolar
debe bloquear hasta que haya un elemento para desencolar.
Suma en paralelo
Crea un programa en Java que calcule la suma de un gran arreglo de números en paralelo utilizando varios hilos. Dividir el arreglo en partes iguales y asignar cada parte a un hilo para que calcule su suma. Luego, sumar los resultados parciales para obtener el resultado final.
Productor-Consumidor
Implementar el ejercicio anterior utilizando un modelo de productor-consumidor, utilizando dos colas sincronizadas Q1 y Q2:
- En 1 thread: Separar el arreglo en partes iguales. Encolar en Q1 cada una de las secciones.
- En K threads: Desencolar de Q1 una sección del arreglo y sumar los elementos. Encolar en Q2 el resultado.
- En 1 thread: Desencolar todos los resultados parciales de Q2 y sumarlos.
Problema de los filósofos cenando
Implementar una solución al problema de los filósofos cenando utilizando hilos en Java. En este problema, varios filósofos comparten una mesa redonda y alternan entre pensar y comer. Sin embargo, solo pueden comer si pueden agarrar dos tenedores adyacentes. Sincronizar correctamente para evitar deadlocks.