This project simulates a restaurant scenario where a waiter serves multiple clients. It demonstrates the use of Java threads to manage concurrent actions of serving and dining, with synchronization to ensure the correct sequence of interactions between the waiter and clients.
The Restaurant Simulation project uses Java's multithreading capabilities to simulate the interactions between a waiter and multiple clients in a restaurant setting. The main class, Restaurante
, sets up the simulation by creating and managing threads for the waiter and each client, ensuring that the events occur in a synchronized and orderly manner.
- Multithreading: Utilizes Java's threading capabilities to manage concurrent tasks.
- Synchronization: Ensures proper coordination between the waiter's and clients' actions.
- Simulation: Creates a realistic scenario of a restaurant experience using print statements to represent the actions of the waiter and clients.
- pom.xml: Maven configuration file that manages project dependencies and build settings.
- src/: Contains the source code and test code for the project.
- main/: Main application code.
- java/: Java source code directory.
- com/mycompany/restaurante/: Package directory containing all the Java classes for the project.
- Restaurante.java: Entry point of the application; sets up and starts the threads for the waiter and clients.
- com/mycompany/restaurante/: Package directory containing all the Java classes for the project.
- java/: Java source code directory.
- test/: Placeholder for test code.
- main/: Main application code.
- target/: Directory generated by Maven during the build process.
- classes/: Contains compiled bytecode of the Java classes.
- com/mycompany/restaurante/: Compiled classes for the project.
- Cliente.class: Compiled bytecode for the Cliente class.
- Mesero.class: Compiled bytecode for the Mesero class.
- Restaurante.class: Compiled bytecode for the Restaurante class.
- com/mycompany/restaurante/: Compiled classes for the project.
- generated-sources/: Directory for generated sources (if any).
- annotations/: Placeholder for annotation processors.
- maven-status/: Directory containing Maven build status files.
- maven-compiler-plugin/compile/default-compile/: Contains lists of created and input files during compilation.
- createdFiles.lst: List of files created during the build.
- inputFiles.lst: List of files used as input during the build.
- maven-compiler-plugin/compile/default-compile/: Contains lists of created and input files during compilation.
- test-classes/: Directory for compiled test classes.
- classes/: Contains compiled bytecode of the Java classes.
This class is the entry point of the simulation. It creates threads for the waiter and each client, managing their interactions.
Main Method:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Ingrese la cantidad de clientes: ");
int numClientes = scanner.nextInt();
scanner.nextLine();
Cliente[] clientes = new Cliente[numClientes];
for (int i = 0; i < numClientes; i++) {
System.out.print("Ingrese el nombre del cliente " + (i + 1) + ": ");
String nombre = scanner.nextLine();
System.out.print("Ingrese el platillo que pedirá el cliente " + (i + 1) + ": ");
String platillo = scanner.nextLine();
clientes[i] = new Cliente(nombre, platillo, Thread.NORM_PRIORITY); // Establecer prioridad normal
}
Mesero mesero = new Mesero(clientes);
mesero.setPriority(Thread.MIN_PRIORITY); // Establecer prioridad mínima para el mesero
mesero.start();
for (Cliente cliente : clientes) {
cliente.start();
}
}
This class represents the waiter. It uses synchronization to coordinate actions with each client.
Run Method:
public void run() {
for (Cliente cliente : clientes) {
synchronized (cliente) {
System.out.println("Mesero: Bienvenido, " + cliente.getNombre() + ". Por favor, tome asiento.");
}
try {
sleep(1000); // Simula el tiempo que toma hacer el pedido.
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (cliente) {
System.out.println("Mesero: Tomando la orden de " + cliente.getNombre() + " para " + cliente.getPlatillo());
cliente.notify(); // Notificar al cliente que su comida está lista.
}
synchronized (cliente) {
try {
cliente.wait(); // Esperar a que el cliente termine de comer.
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Mesero: Recogiendo los platos de " + cliente.getNombre());
}
}
}
This class represents a client in the restaurant. Each client runs in its own thread and interacts with the waiter.
Run Method:
public void run() {
synchronized (this) {
try {
wait(); // Esperar a que el mesero le indique que tome asiento.
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(nombre + ": Tomando asiento en una mesa.");
}
synchronized (this) {
System.out.println(nombre + ": Disfrutando de " + platillo);
try {
sleep(2000); // Simula el tiempo que toma comer.
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(nombre + ": Terminé de comer.");
notify(); // Notificar al mesero que terminó de comer.
}
}
To run the simulation, compile the Java files and execute the Restaurante
class.
- Java Development Kit (JDK)
- Maven for managing project dependencies
- An IDE or text editor for Java development
- Clone the repository.
- Navigate to the
src/main/java/com/mycompany/restaurante
directory. - Compile the Java files using Maven:
mvn compile
. - Run the simulation using:
mvn exec:java -Dexec.mainClass="com.mycompany.restaurante.Restaurante"
.