-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSistema_reservas_biblioteca
More file actions
150 lines (126 loc) · 4.13 KB
/
Sistema_reservas_biblioteca
File metadata and controls
150 lines (126 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import java.util.Random;
class Sala {
private int numero;
private int capacidadMaxima = 4;
private int ocupacionActual = 0;
public Sala(int numero) {
this.numero = numero;
}
public boolean intentarEntrar() {
if (ocupacionActual < capacidadMaxima) {
ocupacionActual++;
return true;
}
return false;
}
public void salir() {
ocupacionActual--;
}
public int getOcupacion() {
return ocupacionActual;
}
public int getNumero() {
return numero;
}
}
class GestorReservas {
private Sala[] salas;
public GestorReservas(int numSalas) {
salas = new Sala[numSalas];
for (int i = 0; i < numSalas; i++) {
salas[i] = new Sala(i + 1);
}
}
public Sala[] getSalas() {
return salas;
}
public boolean reservarSala(int numSala, String estudiante) {
Sala sala = salas[numSala];
if (sala.intentarEntrar()) {
System.out.printf("Estudiante %s ha entrado en sala %d (Ocupación: %d)\n",
estudiante, sala.getNumero(), sala.getOcupacion());
return true;
}
return false;
}
}
class Estudiante implements Runnable {
private String id;
private final GestorReservas gestor;
public Estudiante(String id, GestorReservas gestor) {
this.id = id;
this.gestor = gestor;
}
@Override
public void run() {
Random random = new Random();
while (true) {
int salaDeseada = random.nextInt(gestor.getSalas().length);
System.out.printf("Estudiante %s intenta entrar en sala %d\n",
id, salaDeseada + 1);
while (!gestor.reservarSala(salaDeseada, id)) {
try {
Thread.sleep(1000); // Espera 1 segundo antes de reintentar
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
try {
// Utiliza la sala entre 1 y 5 segundos
Thread.sleep(1000 + random.nextInt(4000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
gestor.getSalas()[salaDeseada].salir();
System.out.printf("Estudiante %s ha salido de sala %d\n",
id, salaDeseada + 1);
try {
// Espera entre 1 y 3 segundos antes de intentar entrar en otra sala
Thread.sleep(1000 + random.nextInt(2000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}
class Monitor implements Runnable {
private final GestorReservas gestor;
public Monitor(GestorReservas gestor) {
this.gestor = gestor;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(5000);
System.out.println("\n=== Estado de ocupación ===");
for (Sala sala : gestor.getSalas()) {
System.out.printf("Sala %d: %d personas\n",
sala.getNumero(), sala.getOcupacion());
}
System.out.println("========================\n");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}
public class ControlSalas {
public static void main(String[] args) {
GestorReservas gestor = new GestorReservas(3);
Thread[] estudiantes = new Thread[10];
for (int i = 0; i < estudiantes.length; i++) {
estudiantes[i] = new Thread(
new Estudiante("E" + (i + 1), gestor)
);
estudiantes[i].start();
}
// Monitor de ocupación
Thread monitorThread = new Thread(new Monitor(gestor));
monitorThread.start();
}
}