Tp3 part 3 for an exam of the second eval PDF

Title Tp3 part 3 for an exam of the second eval
Author Dragon Ball Forever
Course Algoritmos y Programación
Institution Universidad de Las Palmas de Gran Canaria
Pages 4
File Size 143.7 KB
File Type PDF
Total Downloads 88
Total Views 123

Summary

baficnaemigowmgwromh4 jwrngwurht uwhwhg whg t 4hhwy8ootfgtyw 4ht 44 4ytwy tw w4tghewy goh4ugh uh ge4h gerhgh urh g4yehf4h gh eyhg8eha8furhip yyefhg9uerrrrrrrrrrrrrrrrrrrrrr rueh 7 hr7...


Description

15/1/22 14:03

Tecnologías de Programación 2020/2021 2020-21 Convocatoria extraordinaria (Concurrencia) Descripción

Tecnologías de Programación 2020/2021 Área personal / Mis cursos / TP 20/21 / Exámenes / 2020-21 Convocatoria extraordinaria (Concurrencia)

 Descripción

 Ver entrega

2020-21 Convocatoria extraordinaria (Concurrencia)  Disponible desde: Monday, 5 de July de 2021, 12:30  Límite de entrega: Monday, 5 de July de 2021, 13:30  Ficheros requeridos: dexito/GrupoComensales.java, dexito/Camarero.java, dexito/Metre.java, dexito/Main.java ( Descargar) Tipo de trabajo:  Individual

Enunciado Gestión de mesas en un restaurante Se desea construir en Java un sistema que simule de forma concurrente la gestión de mesas en el restaurante Déxito. Este restaurante Déxito dispone de mesas con distinto número de comensales, no hace reservas y los clientes deben acceder al local personalmente y e metre les asigna la mesa disponible más apropiada, si no hay mesa disponible los clientes esperan hasta que haya una apropiada. Una vez usada la mesa, la debe limpiar un camarero para que vuelva a estar disponible. Las mesas pueden estar en 4 estados distintos: disponible, ocupada, sucia y limpiándose.

Estructura general Se han identificado las siguientes clases para representar la gestión de mesas: GrupoComensales. Cada objeto de esta clase representa un grupos de comensales (de 1 a 4 comensales) que ocuparán una mesa y actuará en un hilo independiente. Un grupo de comensales accede al restaurante, le pide una mesa al metre, ocupa la mesa, come y al finalizar informa al metre de que ha terminado. Camarero. Cada objeto de esta clase representa un camarero que actuará en un hilo independiente y cuya única tarea es limpiar las mesas que el metre le va asignando, mientras el restaurante esté abierto o queden mesas por limpiar. Metre. Objeto que gestiona el estado de las mesas, asignando mesas a los grupos de comensales y dando indicaciones a los camareros que deben limpiarlas. La simulación consistirá en: 1. Creación de un objeto metre al que se le indican las mesas que hay en el restaurante y la capacidad de cada una de ellas. 2. Se crearán dos camareros encargados de limpiar mesas según indique el metre. 3. Irán llegando aleatoriamente grupos de comensales que solicitarán una mesa y la ocuparán por un tiempo. 4. Para finalizar la simulación se dejan de crear grupos de comensales y se indica que el restaurante está cerrado para que los camareros finalicen su trabajo. Durante el proceso se le pide información al metre para ir mostrando la situación del restaurante.

Clase GrupoComensales Cada objeto de esta clase se crea pasándole a su constructor, un Metre con el que se comunicará para solicitar la mesa y al que indicará su finalización de uso, y, como segundo parámetro, se le pasa el número de comensales del grupo.

Métodos

Descripción

GrupoComensales(Metre, int)

Construye un objeto grupo comensales indicando el objeto Metre con el que gestiona la mesa y el número de comensales del grupo.

Las acciones que realiza el GrupoComensales en su propio hilo son: 1. Pedir una mesa al metre. 2. Usarla durante un tiempo indicado por Tools.tiempoUsoMesa() en milisegundos. 3. Indicar al metre la finalización del uso de la mesa.

Clase Camarero https://aulaga.dis.ulpgc.es/mod/vpl/view.php?id=8140&userid=886

1/4

15/1/22 14:03

Tecnologías de Programación 2020/2021 2020-21 Convocatoria extraordinaria (Concurrencia) Descripción

Cada objeto de esta clase se crea pasándole a su constructor un Metre con el se comunicará. El camarero, hasta que el metre se lo indique, se dedicará a pedirle mesas para limpiar, dedicará un tiempo a su limpieza, le indicará al metre que ha finalizado y repetirá el proceso. Métodos

Descripción

Camarero(Metre) Construye un objeto camarero indicando el objeto Metre con el que se comunicará. Las acciones a repetir por un camarero en su propio hilo son: 1. Pedir una mesa para limpiar al metre. 2. Limpiarla durante el tiempo que indica Tools.tiempoLimpieza() en milisegundos. 3. Indicar al metre que la mesa está limpia y se puede usar.

Clase Metre Un objeto de esta clase se encarga de gestionar el estado de las mesas (disponible, ocupada, sucia y limpiandose) centralizando las peticiones de los grupos de comensales y los camareros.

Métodos

Descripción

Metre(int[] mesas)

Se inicializa pasándole un array de enteros que representa las mesas en el restaurante. Las mesas están numeradas de 0 al tamaño del array - 1. Los valores en el array indican cuántos comensales caben en cada mesa.

int asignaMesa(int nComensales)

Se llama por un grupo de comensales para pedir una mesa, indican en el parámetro el número de comensales a ocupar la mesa. Devuelve el identificador de la mesa (0 a número de mesas - 1). El grupo esperará lo necesario hasta que se le asigne una mesa apropiada. Después de usarla llamará a desasignaMesa pasándole el identificador de la mesa.

void desasignaMesa(int idMesa)

Indica al metre que la mesa ha dejado de ser usada por el grupo de comensales.

int mesaALimpiar()

Llamado por un camarero para que el metre le asigne una mesa a limpiar. Devuelve un identificador de mesa a limpiar o -1 si el restaurante ha cerrado y no quedan mesas por atender.

void mesaLimpia(int idMesa)

Llamado por un camarero para indicar que la mesa ha quedado limpia y lista para ser usada.

void cerrarRestaurante()

Se llama para indicar al metre que el restaurante está cerrado e indique a los camareros cuándo han terminado su trabajo.

String estado()

El metre devuelve una ristra con la representación de las mesas del restaurante con el siguiente formato: para cada mesa, según su índice y separadas por un espacio, número de ocupantes/número máximo[D|O|S|L]. [D|O|S|L] indicaría Disponible, Ocupada, Sucia y Limpiandose. Ejemplo para un restaurante con cuatro mesas de [4, 3, 2, 2] de capacidad se podría devolver "0/4D 2/3O 0/2S 0/2L" indicando que la mesa 0 está disponible, la mesa 1 tiene 2 ocupantes de los 3 de capacidad, la mesa 2 está vacía y requiere limpieza, y la mesa 3 se está limpiando.

Main.main El programa principal debe completarse para que cree 2 hilos Camarero, los arranque y, secuencialmente, se creen 25 GrupoComensales, debiendo esperar a que terminen el trabajo los camareros. En cualquier parte del programa, puede mostrar información usando Tools.println();

Ficheros requeridos dexito/GrupoComensales.java

https://aulaga.dis.ulpgc.es/mod/vpl/view.php?id=8140&userid=886

2/4

15/1/22 14:03 1 2 3 4 5 6 7 8 9 10 11 12

Tecnologías de Programación 2020/2021 2020-21 Convocatoria extraordinaria (Concurrencia) Descripción

// Modifique/Complete cuando sea necesario package dexito; public class GrupoComensales { private Metre metre; private int comensales; public GrupoComensales(Metre metre, int comensales){ this.metre = metre; this.comensales = comensales; } }

dexito/Camarero.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

// Modifique/Complete cuando sea necesario package dexito; public class Camarero { private Metre metre; public Camarero(Metre metre){ this.metre = metre; } public void run() { int mesa = metre.mesaALimpiar(); while(mesa != -1){ Tools.println(metre.estado()); try { Thread.sleep(Tools.tiempoLimpiezaMesa()); } catch (InterruptedException ignored) {} metre.mesaLimpia(mesa); Tools.println(metre.estado()); mesa = metre.mesaALimpiar(); } } }

dexito/Metre.java 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

// Modifique/Complete cuando sea necesario package dexito; public class Metre { private volatile boolean restauranteAbierto = true; private int[] capacidadMesas; // Numero máximo de comensales en cada mesa private char[] estadoMesas; // Estado de cada mesa 'D', 'O', 'S' y 'L' (Disponible, Ocupada, Sucia y Limpiandose) private int[] ocupacionMesas; // Numero de comensales en cada mesa en un momento dado. No puede ser mayor que capacidadMesas public Metre(int[] mesas){ capacidadMesas = new int[mesas.length]; estadoMesas = new char[mesas.length]; ocupacionMesas = new int[mesas.length]; for(int i = 0 ; i < mesas.length; i++){ capacidadMesas[i] = mesas[i]; estadoMesas[i] = 'D'; ocupacionMesas[i] = 0; } } public int asignaMesa(int nComensales){ return 0; } public void desasignaMesa(int idMesa){ }

public int mesaALimpiar(){ return 0; } public void mesaLimpia(int idMesa){ } public void cerrarRestaurante(){ } public String estado(){ String estado = ""; for(int i = 0; i < ocupacionMesas.length; i++){ estado += ocupacionMesas[i] + "/" + capacidadMesas[i] + estadoMesas[i] + " | "; } return estado; } }

dexito/Main.java

https://aulaga.dis.ulpgc.es/mod/vpl/view.php?id=8140&userid=886

3/4

15/1/22 14:03 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

Tecnologías de Programación 2020/2021 2020-21 Convocatoria extraordinaria (Concurrencia) Descripción

// Modifique/Complete cuando sea necesario package dexito; import java.util.*; import java.io.*; public class Main{ public static void main(String[] args) { int[] mesas = {2,3,4,2,4,5,4}; Metre metre= new Metre(mesas); // Cree dos camareros y arranquelos Camarero c1, c2; c1 = new Camarero(metre); c2 = new Camarero(metre); for (int i= 0; i < 25; i++) { Tools.println(metre.estado()); GrupoComensales grupo = new GrupoComensales(metre, 1 + i % 4); try{ Thread.sleep(Tools.tiempoLlegada()); }catch(InterruptedException e){} } metre.cerrarRestaurante(); Tools.println("Esperando finalizar"); // Espere aquí a que terminen los camareros Tools.println(metre.estado()); } } class Tools { private static long inicio = System.currentTimeMillis(); private static Random r = new Random(); static { r.setSeed(13); } public static long tiempoUsoMesa() { return 500 + r.nextInt(1000); } public static long tiempoLimpiezaMesa() { return 200 + r.nextInt(2000); } public static long tiempoLlegada() { return 1 + r.nextInt(1000); } public static void println(String info) { synchronized(System.out) { float lapse = (System.currentTimeMillis() - inicio)/1000f; System.out.println(String.format("%05.1f %s" , lapse , info)); } } }

VPL ◄ 2020-21 Convocatoria extraordinaria (GUI) Ir a...

Organización EII ULPGC Español - Internacional (es) English (en) Español - Internacional (es)

Resumen de retención de datos Descargar la app para dispositivos móviles

https://aulaga.dis.ulpgc.es/mod/vpl/view.php?id=8140&userid=886

4/4...


Similar Free PDFs