[{"data":1,"prerenderedAt":1472},["ShallowReactive",2],{"navigation_docs":3,"-actividades-act-06":298,"-actividades-act-06-surround":1467},[4,18,70,105,149,178,212,257],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Evaluación","\u002Fintroduction","1.introduction\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Método de Evaluación","i-iconamoon-cheque-bold",{"title":13,"path":14,"stem":15,"icon":16},"Plataforma de Aprendizaje","\u002Fintroduction\u002Fplataforma","1.introduction\u002F2.plataforma","i-lucide-book-marked","i-lucide-house",{"title":19,"path":20,"stem":21,"children":22,"icon":25},"Interfaz Gráfica de Usuario","\u002Fgui","2.gui\u002F01.index",[23,26,30,34,38,42,46,50,54,58,62,66],{"title":24,"path":20,"stem":21,"icon":25},"¿Qué es una Interfaz Gráfica de Usuario (GUI)?","i-carbon-gui-management",{"title":27,"path":28,"stem":29,"icon":25},"Creación de Interfaces Gráficas de Usuario (GUI)","\u002Fgui\u002Fbuild-gui","2.gui\u002F02.build-gui",{"title":31,"path":32,"stem":33,"icon":25},"Componentes Básicos de Swing","\u002Fgui\u002Fcomponentes-basicos","2.gui\u002F03.componentes-basicos",{"title":35,"path":36,"stem":37},"El componente JFrame","\u002Fgui\u002Fjframe","2.gui\u002F04.jframe",{"title":39,"path":40,"stem":41},"El componente JPanel","\u002Fgui\u002Fjpanel","2.gui\u002F05.jpanel",{"title":43,"path":44,"stem":45},"El componente JButton","\u002Fgui\u002Fjbutton","2.gui\u002F06.jbutton",{"title":47,"path":48,"stem":49,"icon":25},"Elementos de texto en interfaces gráficas con Swing","\u002Fgui\u002Ftext","2.gui\u002F07.text",{"title":51,"path":52,"stem":53},"Elementos Visuales","\u002Fgui\u002Felementos-visuales","2.gui\u002F08.elementos-visuales",{"title":55,"path":56,"stem":57,"icon":25},"Eventos en Swing","\u002Fgui\u002Feventos","2.gui\u002F09.eventos",{"title":59,"path":60,"stem":61,"icon":25},"Controles en Swing","\u002Fgui\u002Fcontroles","2.gui\u002F10.controles",{"title":63,"path":64,"stem":65,"icon":25},"Atributos Comunes de los Componentes de Diseño","\u002Fgui\u002Fatributos-comunes","2.gui\u002F11.atributos-comunes",{"title":67,"path":68,"stem":69,"icon":25},"Layouts","\u002Fgui\u002Flayout","2.gui\u002F12.layout",{"title":71,"icon":25,"path":72,"stem":73,"children":74,"page":104},"Personalización","\u002Fpersonalizacion","3.personalizacion",[75,79,84,88,92,96,100],{"title":76,"path":77,"stem":78},"Jerarquía de clases en Swing","\u002Fpersonalizacion\u002Fjerarquia","3.personalizacion\u002F01.jerarquia",{"title":80,"path":81,"stem":82,"icon":83},"Personalización Inicial de Componentes Swing","\u002Fpersonalizacion\u002Fpersonalizacion-inicial","3.personalizacion\u002F02.personalizacion-inicial","i-carbon-palette",{"title":85,"path":86,"stem":87,"icon":83},"Tema y Personalización Avanzada en Swing","\u002Fpersonalizacion\u002Ftheme","3.personalizacion\u002F03.theme",{"title":89,"path":90,"stem":91,"icon":83},"Pintando en Swing","\u002Fpersonalizacion\u002Fpaint","3.personalizacion\u002F04.paint",{"title":93,"path":94,"stem":95,"icon":83},"Mi Tema 1: Comenzando con la Personalización","\u002Fpersonalizacion\u002Ftheme-start","3.personalizacion\u002F05.theme-start",{"title":97,"path":98,"stem":99,"icon":83},"UI Delegates: Personalizando la Apariencia de los Componentes","\u002Fpersonalizacion\u002Fui-delegates","3.personalizacion\u002F06.ui-delegates",{"title":101,"path":102,"stem":103,"icon":83},"Empleado delegadores de UI para personalizar la apariencia de los componentes","\u002Fpersonalizacion\u002Ftheme-02","3.personalizacion\u002F07.theme-02",false,{"title":106,"path":107,"stem":108,"children":109,"icon":148},"Programación concurrente","\u002Fconcurrencia","4.concurrencia\u002F01.index",[110,112,116,120,124,128,132,136,140,144],{"title":111,"path":107,"stem":108,"icon":83},"¿Qué es la concurrencia?",{"title":113,"path":114,"stem":115,"icon":83},"Unidades de Ejecución","\u002Fconcurrencia\u002Funidades-ejecucion","4.concurrencia\u002F02.unidades-ejecucion",{"title":117,"path":118,"stem":119,"icon":83},"Programa de flujo único y de flujo múltiple","\u002Fconcurrencia\u002Fflujos","4.concurrencia\u002F03.flujos",{"title":121,"path":122,"stem":123,"icon":83},"Hilos con Thread y Runnable","\u002Fconcurrencia\u002Fthread-runnable","4.concurrencia\u002F04.thread-runnable",{"title":125,"path":126,"stem":127},"Paralelismo V.S. Concurrencia","\u002Fconcurrencia\u002Fparalelismo","4.concurrencia\u002F05.paralelismo",{"title":129,"path":130,"stem":131,"icon":83},"Problemas clásicos de concurrencia","\u002Fconcurrencia\u002Fproblemas","4.concurrencia\u002F06.problemas",{"title":133,"path":134,"stem":135,"icon":83},"Emulando condiciones de carrera en Java","\u002Fconcurrencia\u002Fcondiciones-carrera","4.concurrencia\u002F07.condiciones-carrera",{"title":137,"path":138,"stem":139,"icon":83},"Semáforos en Java","\u002Fconcurrencia\u002Fsemaforos","4.concurrencia\u002F08.semaforos",{"title":141,"path":142,"stem":143,"icon":83},"La clase Timer en Java Swing","\u002Fconcurrencia\u002Ftimer","4.concurrencia\u002F09.timer",{"title":145,"path":146,"stem":147,"icon":83},"Algoritmos de ordenamiento de procesos","\u002Fconcurrencia\u002Falgoritmos-procesos","4.concurrencia\u002F10.algoritmos-procesos","i-carbon-parallel-groups",{"title":150,"path":151,"stem":152,"children":153,"icon":177},"Acceso a datos","\u002Fdatos","5.datos\u002F01.index",[154,157,161,165,169,173],{"title":155,"path":151,"stem":152,"icon":156},"Java y las bases de datos","i-carbon-database",{"title":158,"path":159,"stem":160},"Cliente Servidor","\u002Fdatos\u002Fcliente-servidor","5.datos\u002F02.cliente-servidor",{"title":162,"path":163,"stem":164},"CRUD","\u002Fdatos\u002Fcrud","5.datos\u002F03.crud",{"title":166,"path":167,"stem":168},"Sentencias Preparadas con JDBC","\u002Fdatos\u002Fsentencia-preparada","5.datos\u002F04.sentencia-preparada",{"title":170,"path":171,"stem":172},"DAO (Data Access Object)","\u002Fdatos\u002Fdao","5.datos\u002F05.dao",{"title":174,"path":175,"stem":176},"Usando Hibernate ORM","\u002Fdatos\u002Form","5.datos\u002F06.orm","i-gravity-ui-database-fill",{"title":179,"path":180,"stem":181,"children":182,"icon":211},"Programación móvil","\u002Fmovil","6.movil\u002F01.index",[183,186,191,195,199,203,207],{"title":184,"path":180,"stem":181,"icon":185},"¿Qué es Android y Kotlin?","i-carbon-mobile",{"title":187,"path":188,"stem":189,"icon":190},"¿Qué es Android Studio?","\u002Fmovil\u002Fandroid-studio","6.movil\u002F02.android-studio","i-carbon-application",{"title":192,"path":193,"stem":194,"icon":190},"¿Qué es Jetpack Compose?","\u002Fmovil\u002Fjetpack-compose","6.movil\u002F03.jetpack-compose",{"title":196,"path":197,"stem":198},"Filas y Columnas con Jetpack Compose","\u002Fmovil\u002Ffilas-columnas","6.movil\u002F04.filas-columnas",{"title":200,"path":201,"stem":202,"icon":190},"Componentes Básicos en Jetpack Compose","\u002Fmovil\u002Fcomponentes-basicos","6.movil\u002F05.componentes-basicos",{"title":204,"path":205,"stem":206,"icon":190},"Las Intenciones en Android con Jetpack Compose","\u002Fmovil\u002Fintentions","6.movil\u002F06.intentions",{"title":208,"path":209,"stem":210,"icon":190},"Navegación en Android con Jetpack Compose","\u002Fmovil\u002Fnavegacion","6.movil\u002F07.navegacion","phone_android",{"title":213,"icon":25,"path":214,"stem":215,"children":216,"page":104},"Ejemplos","\u002Fejemplos","7.ejemplos",[217,221,225,229,233,237,241,245,249,253],{"title":218,"path":219,"stem":220},"Ejemplo 01: Creando un validador abstracto de expresiones","\u002Fejemplos\u002Fejemplo-01","7.ejemplos\u002F01.ejemplo-01",{"title":222,"path":223,"stem":224},"Ejemplo 02: Diferencias de validar un JTextField y un JFormattedTextField","\u002Fejemplos\u002Fejemplo-02","7.ejemplos\u002F02.ejemplo-02",{"title":226,"path":227,"stem":228},"Ejemplo 03: Creando una Aplicación con GUI en Java Swing","\u002Fejemplos\u002Fejemplo-03","7.ejemplos\u002F03.ejemplo-03",{"title":230,"path":231,"stem":232},"Ejemplo 4: Estilizando componentes Swing con Delegadores","\u002Fejemplos\u002Fejemplo-04","7.ejemplos\u002F04.ejemplo-04",{"title":234,"path":235,"stem":236,"icon":83},"Ejemplo 5: Uso de Hilos con Thread y Runnable","\u002Fejemplos\u002Fejemplo-05","7.ejemplos\u002F05.ejemplo-05",{"title":238,"path":239,"stem":240,"icon":83},"Ejemplo 06: Manejando Hilos de formas Diferentes en Java","\u002Fejemplos\u002Fejemplo-06","7.ejemplos\u002F06.ejemplo-06",{"title":242,"path":243,"stem":244,"icon":83},"Ejemplo 7: Condiciones de carrera en Java","\u002Fejemplos\u002Fejemplo-07","7.ejemplos\u002F07.ejemplo-07",{"title":246,"path":247,"stem":248,"icon":83},"Ejemplo 8: Control de acceso a recursos compartidos con semáforos","\u002Fejemplos\u002Fejemplo-08","7.ejemplos\u002F08.ejemplo-08",{"title":250,"path":251,"stem":252,"icon":83},"Ejemplo 9: El restaurante y los pedidos","\u002Fejemplos\u002Fejemplo-09","7.ejemplos\u002F09.ejemplo-09",{"title":254,"path":255,"stem":256},"Ejemplo 10: Proceso FIFO (First In, First Out) con Semáforos y Swing","\u002Fejemplos\u002Fejemplo-10","7.ejemplos\u002F10.ejemplo-10",{"title":258,"icon":25,"path":259,"stem":260,"children":261,"page":104},"Actividades","\u002Factividades","8.actividades",[262,266,270,274,278,282,286,290,294],{"title":263,"path":264,"stem":265,"icon":25},"Actividad 1: Introducción al diseño de interfaces","\u002Factividades\u002Fact-01","8.actividades\u002F01.act-01",{"title":267,"path":268,"stem":269,"icon":25},"Actividad 2: Diseño de wireframes y prototipos","\u002Factividades\u002Fact-02","8.actividades\u002F02.act-02",{"title":271,"path":272,"stem":273,"icon":25},"Actividad 3: Propuesta de Proyecto y Wireframe inicial","\u002Factividades\u002Fact-03","8.actividades\u002F03.act-03",{"title":275,"path":276,"stem":277,"icon":83},"Actividad 4: Temas y Componentes Personalizados en Swing","\u002Factividades\u002Fact-04","8.actividades\u002F04.act-04",{"title":279,"path":280,"stem":281,"icon":83},"Actividad 5: Explicando la Concurrencia a un Niño de 5 Años","\u002Factividades\u002Fact-05","8.actividades\u002F05.act-05",{"title":283,"path":284,"stem":285,"icon":83},"Actividad 6: Simulación de una cocina con múltiples chefs (hilos)","\u002Factividades\u002Fact-06","8.actividades\u002F06.act-06",{"title":287,"path":288,"stem":289,"icon":83},"Actividad 7: Sistema de retiro bancario","\u002Factividades\u002Fact-07","8.actividades\u002F07.act-07",{"title":291,"path":292,"stem":293,"icon":83},"Actividad 8: Simulación de Round Robin con hilos e Interfaz Gráfica","\u002Factividades\u002Fact-08","8.actividades\u002F08.act-08",{"title":295,"path":296,"stem":297,"icon":83},"Actividad 9: CRUD con Hibernate y Swing","\u002Factividades\u002Fact-09","8.actividades\u002F09.act-09",{"id":299,"title":283,"body":300,"description":306,"extension":1461,"links":1462,"meta":1463,"navigation":1464,"path":284,"seo":1465,"stem":285,"__hash__":1466},"docs\u002F8.actividades\u002F06.act-06.md",{"type":301,"value":302,"toc":1453},"minimark",[303,307,312,315,318,322,381,384,395,399,942,1366,1371,1407,1411,1414,1442,1445,1449],[304,305,306],"p",{},"En esta actividad, simularás una cocina con múltiples chefs (hilos) que preparan diferentes platos. Cada chef tendrá su propia tarea y compartirá recursos como la estufa y los utensilios de cocina. Deberás implementar la sincronización adecuada para evitar conflictos y garantizar que los chefs trabajen de manera eficiente.",[308,309,311],"h2",{"id":310},"descripción-de-la-actividad","Descripción de la Actividad",[304,313,314],{},"Se quiere simular una cocina donde trabajan varios chefs (hilos) preparando diferentes platos. Cada chef sigue una receta que consta de varios pasos (por ejemplo, 3 pasos). Cada paso tiene una duración aleatoria (entre 1 y 4 segundos) que se simula con Thread.sleep(). Los chefs deben imprimir mensajes indicando en qué paso se encuentran.",[304,316,317],{},"El chef principal (el hilo main) debe esperar a que todos los chefs terminen sus platos antes de servir la comida, usando join(). Además, existe un gerente (otro hilo) que, después de un tiempo, puede decidir interrumpir a un chef si considera que su plato se está demorando demasiado. Para ello, el gerente llama a interrupt() sobre el hilo del chef. Los chefs deben estar preparados para recibir esa interrupción y finalizar su trabajo de forma ordenada.",[308,319,321],{"id":320},"requisitos","Requisitos",[323,324,325,329,350,378],"ol",{},[326,327,328],"li",{},"Crear una clase Chef que extienda Thread o implemente Runnable. Cada chef tendrá un nombre y un número de pasos (por ejemplo, 3).",[326,330,331,332],{},"En el método run():\n",[333,334,335,338,341,344,347],"ul",{},[326,336,337],{},"Iterar sobre cada paso.",[326,339,340],{},"Antes de cada paso, verificar si el hilo ha sido interrumpido usando Thread.currentThread().isInterrupted(). Si es así, terminar el hilo mostrando un mensaje.",[326,342,343],{},"Simular la duración del paso con Thread.sleep() y un tiempo aleatorio entre 1 y 4 segundos.",[326,345,346],{},"Imprimir un mensaje indicando el paso actual y el tiempo que tomará.",[326,348,349],{},"Manejar InterruptedException de manera que, si ocurre durante el sleep, se termine el hilo ordenadamente.",[326,351,352,353],{},"En el método main:\n",[333,354,355,358,361,372,375],{},[326,356,357],{},"Crear un array de al menos 3 chefs (por ejemplo, \"Juan\", \"María\", \"Carlos\").",[326,359,360],{},"Iniciar todos los chefs con start().",[326,362,363,364],{},"Crear un hilo \"gerente\" que:\n",[333,365,366,369],{},[326,367,368],{},"Duerma durante 5 segundos (simulando el tiempo de espera del gerente).",[326,370,371],{},"Luego elija un chef al azar que aún esté vivo (usando isAlive()) y llame a interrupt() sobre él.",[326,373,374],{},"Después de lanzar al gerente, el main debe esperar a que todos los chefs terminen, usando join() para cada uno.",[326,376,377],{},"Al final, imprimir un mensaje indicando que todos los chefs han finalizado (o que algunos fueron interrumpidos).",[326,379,380],{},"Manejar adecuadamente las excepciones para que el programa no termine abruptamente.",[304,382,383],{},"Así mismo, una vez hecho lo anterior, realiza lo siguiente:",[333,385,386,389,392],{},[326,387,388],{},"Modificar el programa para que el gerente pueda interrumpir a más de un chef, por ejemplo, interrumpiendo a un chef cada 5 segundos durante un total de 15 segundos.",[326,390,391],{},"Implementar que el chef, al ser interrumpido, pueda completar el paso actual antes de salir (verificando la interrupción solo entre pasos).",[326,393,394],{},"Agregar un tiempo límite global: si pasados 10 segundos algún chef no ha terminado, el main interrumpe a todos y luego espera con join().",[308,396,398],{"id":397},"código-base-de-ejemplo","Código base de ejemplo",[400,401,406],"pre",{"className":402,"code":403,"language":404,"meta":405,"style":405},"language-java shiki shiki-themes github-dark","import java.util.Random;\n\npublic class Chef extends Thread {\n    private String nombre;\n    private int pasos;\n    private Random rand = new Random();\n\n    public Chef(String nombre, int pasos) {\n        this.nombre = nombre;\n        this.pasos = pasos;\n    }\n\n    @Override\n    public void run() {\n        IO.println(\"Chef \" + nombre + \": Iniciando preparación (\" + pasos + \" pasos).\");\n        try {\n            for (int i = 1; i \u003C= pasos; i++) {\n                \u002F\u002F Verificar interrupción antes de empezar el paso\n                if (Thread.currentThread().isInterrupted()) {\n                    IO.println(\"Chef \" + nombre + \": Me interrumpieron antes del paso \" + i + \". Saliendo.\");\n                    return;\n                }\n\n                int tiempo = rand.nextInt(3000) + 1000; \u002F\u002F 1 a 4 segundos\n                IO.println(\"Chef \" + nombre + \": Paso \" + i + \"\u002F\" + pasos + \" (\" + tiempo\u002F1000 + \" segundos)\");\n                Thread.sleep(tiempo);\n            }\n            IO.println(\"Chef \" + nombre + \": ¡Plato terminado!\");\n        } catch (InterruptedException e) {\n            IO.println(\"Chef \" + nombre + \": Interrumpido durante un paso. Saliendo.\");\n            \u002F\u002F No es necesario restaurar la interrupción porque vamos a salir\n        }\n    }\n}\n","java","",[407,408,409,422,429,451,460,471,491,496,523,538,550,556,561,570,584,625,633,666,673,694,726,735,741,746,782,839,851,857,880,897,919,925,931,936],"code",{"__ignoreMap":405},[410,411,414,418],"span",{"class":412,"line":413},"line",1,[410,415,417],{"class":416},"snl16","import",[410,419,421],{"class":420},"s95oV"," java.util.Random;\n",[410,423,425],{"class":412,"line":424},2,[410,426,428],{"emptyLinePlaceholder":427},true,"\n",[410,430,432,435,438,442,445,448],{"class":412,"line":431},3,[410,433,434],{"class":416},"public",[410,436,437],{"class":416}," class",[410,439,441],{"class":440},"svObZ"," Chef",[410,443,444],{"class":416}," extends",[410,446,447],{"class":440}," Thread",[410,449,450],{"class":420}," {\n",[410,452,454,457],{"class":412,"line":453},4,[410,455,456],{"class":416},"    private",[410,458,459],{"class":420}," String nombre;\n",[410,461,463,465,468],{"class":412,"line":462},5,[410,464,456],{"class":416},[410,466,467],{"class":416}," int",[410,469,470],{"class":420}," pasos;\n",[410,472,474,476,479,482,485,488],{"class":412,"line":473},6,[410,475,456],{"class":416},[410,477,478],{"class":420}," Random rand ",[410,480,481],{"class":416},"=",[410,483,484],{"class":416}," new",[410,486,487],{"class":440}," Random",[410,489,490],{"class":420},"();\n",[410,492,494],{"class":412,"line":493},7,[410,495,428],{"emptyLinePlaceholder":427},[410,497,499,502,504,507,511,514,517,520],{"class":412,"line":498},8,[410,500,501],{"class":416},"    public",[410,503,441],{"class":440},[410,505,506],{"class":420},"(String ",[410,508,510],{"class":509},"s9osk","nombre",[410,512,513],{"class":420},", ",[410,515,516],{"class":416},"int",[410,518,519],{"class":509}," pasos",[410,521,522],{"class":420},") {\n",[410,524,526,530,533,535],{"class":412,"line":525},9,[410,527,529],{"class":528},"sDLfK","        this",[410,531,532],{"class":420},".nombre ",[410,534,481],{"class":416},[410,536,537],{"class":420}," nombre;\n",[410,539,541,543,546,548],{"class":412,"line":540},10,[410,542,529],{"class":528},[410,544,545],{"class":420},".pasos ",[410,547,481],{"class":416},[410,549,470],{"class":420},[410,551,553],{"class":412,"line":552},11,[410,554,555],{"class":420},"    }\n",[410,557,559],{"class":412,"line":558},12,[410,560,428],{"emptyLinePlaceholder":427},[410,562,564,567],{"class":412,"line":563},13,[410,565,566],{"class":420},"    @",[410,568,569],{"class":416},"Override\n",[410,571,573,575,578,581],{"class":412,"line":572},14,[410,574,501],{"class":416},[410,576,577],{"class":416}," void",[410,579,580],{"class":440}," run",[410,582,583],{"class":420},"() {\n",[410,585,587,590,593,596,600,603,606,609,612,614,617,619,622],{"class":412,"line":586},15,[410,588,589],{"class":420},"        IO.",[410,591,592],{"class":440},"println",[410,594,595],{"class":420},"(",[410,597,599],{"class":598},"sU2Wk","\"Chef \"",[410,601,602],{"class":416}," +",[410,604,605],{"class":420}," nombre ",[410,607,608],{"class":416},"+",[410,610,611],{"class":598}," \": Iniciando preparación (\"",[410,613,602],{"class":416},[410,615,616],{"class":420}," pasos ",[410,618,608],{"class":416},[410,620,621],{"class":598}," \" pasos).\"",[410,623,624],{"class":420},");\n",[410,626,628,631],{"class":412,"line":627},16,[410,629,630],{"class":416},"        try",[410,632,450],{"class":420},[410,634,636,639,642,644,647,649,652,655,658,661,664],{"class":412,"line":635},17,[410,637,638],{"class":416},"            for",[410,640,641],{"class":420}," (",[410,643,516],{"class":416},[410,645,646],{"class":420}," i ",[410,648,481],{"class":416},[410,650,651],{"class":528}," 1",[410,653,654],{"class":420},"; i ",[410,656,657],{"class":416},"\u003C=",[410,659,660],{"class":420}," pasos; i",[410,662,663],{"class":416},"++",[410,665,522],{"class":420},[410,667,669],{"class":412,"line":668},18,[410,670,672],{"class":671},"sAwPA","                \u002F\u002F Verificar interrupción antes de empezar el paso\n",[410,674,676,679,682,685,688,691],{"class":412,"line":675},19,[410,677,678],{"class":416},"                if",[410,680,681],{"class":420}," (Thread.",[410,683,684],{"class":440},"currentThread",[410,686,687],{"class":420},"().",[410,689,690],{"class":440},"isInterrupted",[410,692,693],{"class":420},"()) {\n",[410,695,697,700,702,704,706,708,710,712,715,717,719,721,724],{"class":412,"line":696},20,[410,698,699],{"class":420},"                    IO.",[410,701,592],{"class":440},[410,703,595],{"class":420},[410,705,599],{"class":598},[410,707,602],{"class":416},[410,709,605],{"class":420},[410,711,608],{"class":416},[410,713,714],{"class":598}," \": Me interrumpieron antes del paso \"",[410,716,602],{"class":416},[410,718,646],{"class":420},[410,720,608],{"class":416},[410,722,723],{"class":598}," \". Saliendo.\"",[410,725,624],{"class":420},[410,727,729,732],{"class":412,"line":728},21,[410,730,731],{"class":416},"                    return",[410,733,734],{"class":420},";\n",[410,736,738],{"class":412,"line":737},22,[410,739,740],{"class":420},"                }\n",[410,742,744],{"class":412,"line":743},23,[410,745,428],{"emptyLinePlaceholder":427},[410,747,749,752,755,757,760,763,765,768,771,773,776,779],{"class":412,"line":748},24,[410,750,751],{"class":416},"                int",[410,753,754],{"class":420}," tiempo ",[410,756,481],{"class":416},[410,758,759],{"class":420}," rand.",[410,761,762],{"class":440},"nextInt",[410,764,595],{"class":420},[410,766,767],{"class":528},"3000",[410,769,770],{"class":420},") ",[410,772,608],{"class":416},[410,774,775],{"class":528}," 1000",[410,777,778],{"class":420},"; ",[410,780,781],{"class":671},"\u002F\u002F 1 a 4 segundos\n",[410,783,785,788,790,792,794,796,798,800,803,805,807,809,812,814,816,818,821,823,826,829,832,834,837],{"class":412,"line":784},25,[410,786,787],{"class":420},"                IO.",[410,789,592],{"class":440},[410,791,595],{"class":420},[410,793,599],{"class":598},[410,795,602],{"class":416},[410,797,605],{"class":420},[410,799,608],{"class":416},[410,801,802],{"class":598}," \": Paso \"",[410,804,602],{"class":416},[410,806,646],{"class":420},[410,808,608],{"class":416},[410,810,811],{"class":598}," \"\u002F\"",[410,813,602],{"class":416},[410,815,616],{"class":420},[410,817,608],{"class":416},[410,819,820],{"class":598}," \" (\"",[410,822,602],{"class":416},[410,824,825],{"class":420}," tiempo",[410,827,828],{"class":416},"\u002F",[410,830,831],{"class":528},"1000",[410,833,602],{"class":416},[410,835,836],{"class":598}," \" segundos)\"",[410,838,624],{"class":420},[410,840,842,845,848],{"class":412,"line":841},26,[410,843,844],{"class":420},"                Thread.",[410,846,847],{"class":440},"sleep",[410,849,850],{"class":420},"(tiempo);\n",[410,852,854],{"class":412,"line":853},27,[410,855,856],{"class":420},"            }\n",[410,858,860,863,865,867,869,871,873,875,878],{"class":412,"line":859},28,[410,861,862],{"class":420},"            IO.",[410,864,592],{"class":440},[410,866,595],{"class":420},[410,868,599],{"class":598},[410,870,602],{"class":416},[410,872,605],{"class":420},[410,874,608],{"class":416},[410,876,877],{"class":598}," \": ¡Plato terminado!\"",[410,879,624],{"class":420},[410,881,883,886,889,892,895],{"class":412,"line":882},29,[410,884,885],{"class":420},"        } ",[410,887,888],{"class":416},"catch",[410,890,891],{"class":420}," (InterruptedException ",[410,893,894],{"class":509},"e",[410,896,522],{"class":420},[410,898,900,902,904,906,908,910,912,914,917],{"class":412,"line":899},30,[410,901,862],{"class":420},[410,903,592],{"class":440},[410,905,595],{"class":420},[410,907,599],{"class":598},[410,909,602],{"class":416},[410,911,605],{"class":420},[410,913,608],{"class":416},[410,915,916],{"class":598}," \": Interrumpido durante un paso. Saliendo.\"",[410,918,624],{"class":420},[410,920,922],{"class":412,"line":921},31,[410,923,924],{"class":671},"            \u002F\u002F No es necesario restaurar la interrupción porque vamos a salir\n",[410,926,928],{"class":412,"line":927},32,[410,929,930],{"class":420},"        }\n",[410,932,934],{"class":412,"line":933},33,[410,935,555],{"class":420},[410,937,939],{"class":412,"line":938},34,[410,940,941],{"class":420},"}\n",[400,943,945],{"className":402,"code":944,"language":404,"meta":405,"style":405},"public class Cocina {\n    void main() {\n        Chef[] chefs = {\n            new Chef(\"Juan\", 3),\n            new Chef(\"María\", 3),\n            new Chef(\"Carlos\", 3)\n        };\n\n        for (Chef c : chefs) {\n            c.start();\n        }\n\n        \u002F\u002F Hilo gerente\n        Thread gerente = new Thread(() -> {\n            try {\n                Thread.sleep(5000); \u002F\u002F Espera 5 segundos antes de intervenir\n                \u002F\u002F Buscar un chef que aún esté vivo\n                for (Chef c : chefs) {\n                    if (c.isAlive()) {\n                        System.out.println(\"Gerente: El chef \" + c.getName() + \" aún no termina. Lo interrumpo.\");\n                        c.interrupt();\n                        break; \u002F\u002F Solo interrumpimos a uno\n                    }\n                }\n            } catch (InterruptedException e) {\n                System.err.println(\"Gerente interrumpido mientras esperaba.\");\n            }\n        });\n        gerente.start();\n\n        \u002F\u002F Esperar a que todos los chefs terminen\n        for (Chef c : chefs) {\n            try {\n                c.join();\n            } catch (InterruptedException e) {\n                System.err.println(\"Main interrumpido mientras esperaba a \" + c.getName());\n            }\n        }\n\n        System.out.println(\"Main: Todos los chefs han finalizado. ¡A servir la comida!\");\n    }\n}\n",[407,946,947,958,968,980,1000,1017,1035,1040,1044,1058,1068,1072,1076,1081,1100,1107,1124,1129,1140,1153,1183,1193,1203,1208,1212,1225,1239,1243,1248,1257,1261,1266,1276,1282,1292,1305,1326,1331,1336,1341,1356,1361],{"__ignoreMap":405},[410,948,949,951,953,956],{"class":412,"line":413},[410,950,434],{"class":416},[410,952,437],{"class":416},[410,954,955],{"class":440}," Cocina",[410,957,450],{"class":420},[410,959,960,963,966],{"class":412,"line":424},[410,961,962],{"class":416},"    void",[410,964,965],{"class":440}," main",[410,967,583],{"class":420},[410,969,970,973,976,978],{"class":412,"line":431},[410,971,972],{"class":416},"        Chef",[410,974,975],{"class":420},"[] chefs ",[410,977,481],{"class":416},[410,979,450],{"class":420},[410,981,982,985,987,989,992,994,997],{"class":412,"line":453},[410,983,984],{"class":416},"            new",[410,986,441],{"class":440},[410,988,595],{"class":420},[410,990,991],{"class":598},"\"Juan\"",[410,993,513],{"class":420},[410,995,996],{"class":528},"3",[410,998,999],{"class":420},"),\n",[410,1001,1002,1004,1006,1008,1011,1013,1015],{"class":412,"line":462},[410,1003,984],{"class":416},[410,1005,441],{"class":440},[410,1007,595],{"class":420},[410,1009,1010],{"class":598},"\"María\"",[410,1012,513],{"class":420},[410,1014,996],{"class":528},[410,1016,999],{"class":420},[410,1018,1019,1021,1023,1025,1028,1030,1032],{"class":412,"line":473},[410,1020,984],{"class":416},[410,1022,441],{"class":440},[410,1024,595],{"class":420},[410,1026,1027],{"class":598},"\"Carlos\"",[410,1029,513],{"class":420},[410,1031,996],{"class":528},[410,1033,1034],{"class":420},")\n",[410,1036,1037],{"class":412,"line":493},[410,1038,1039],{"class":420},"        };\n",[410,1041,1042],{"class":412,"line":498},[410,1043,428],{"emptyLinePlaceholder":427},[410,1045,1046,1049,1052,1055],{"class":412,"line":525},[410,1047,1048],{"class":416},"        for",[410,1050,1051],{"class":420}," (Chef c ",[410,1053,1054],{"class":416},":",[410,1056,1057],{"class":420}," chefs) {\n",[410,1059,1060,1063,1066],{"class":412,"line":540},[410,1061,1062],{"class":420},"            c.",[410,1064,1065],{"class":440},"start",[410,1067,490],{"class":420},[410,1069,1070],{"class":412,"line":552},[410,1071,930],{"class":420},[410,1073,1074],{"class":412,"line":558},[410,1075,428],{"emptyLinePlaceholder":427},[410,1077,1078],{"class":412,"line":563},[410,1079,1080],{"class":671},"        \u002F\u002F Hilo gerente\n",[410,1082,1083,1086,1088,1090,1092,1095,1098],{"class":412,"line":572},[410,1084,1085],{"class":420},"        Thread gerente ",[410,1087,481],{"class":416},[410,1089,484],{"class":416},[410,1091,447],{"class":440},[410,1093,1094],{"class":420},"(() ",[410,1096,1097],{"class":416},"->",[410,1099,450],{"class":420},[410,1101,1102,1105],{"class":412,"line":586},[410,1103,1104],{"class":416},"            try",[410,1106,450],{"class":420},[410,1108,1109,1111,1113,1115,1118,1121],{"class":412,"line":627},[410,1110,844],{"class":420},[410,1112,847],{"class":440},[410,1114,595],{"class":420},[410,1116,1117],{"class":528},"5000",[410,1119,1120],{"class":420},"); ",[410,1122,1123],{"class":671},"\u002F\u002F Espera 5 segundos antes de intervenir\n",[410,1125,1126],{"class":412,"line":635},[410,1127,1128],{"class":671},"                \u002F\u002F Buscar un chef que aún esté vivo\n",[410,1130,1131,1134,1136,1138],{"class":412,"line":668},[410,1132,1133],{"class":416},"                for",[410,1135,1051],{"class":420},[410,1137,1054],{"class":416},[410,1139,1057],{"class":420},[410,1141,1142,1145,1148,1151],{"class":412,"line":675},[410,1143,1144],{"class":416},"                    if",[410,1146,1147],{"class":420}," (c.",[410,1149,1150],{"class":440},"isAlive",[410,1152,693],{"class":420},[410,1154,1155,1158,1160,1162,1165,1167,1170,1173,1176,1178,1181],{"class":412,"line":696},[410,1156,1157],{"class":420},"                        System.out.",[410,1159,592],{"class":440},[410,1161,595],{"class":420},[410,1163,1164],{"class":598},"\"Gerente: El chef \"",[410,1166,602],{"class":416},[410,1168,1169],{"class":420}," c.",[410,1171,1172],{"class":440},"getName",[410,1174,1175],{"class":420},"() ",[410,1177,608],{"class":416},[410,1179,1180],{"class":598}," \" aún no termina. Lo interrumpo.\"",[410,1182,624],{"class":420},[410,1184,1185,1188,1191],{"class":412,"line":728},[410,1186,1187],{"class":420},"                        c.",[410,1189,1190],{"class":440},"interrupt",[410,1192,490],{"class":420},[410,1194,1195,1198,1200],{"class":412,"line":737},[410,1196,1197],{"class":416},"                        break",[410,1199,778],{"class":420},[410,1201,1202],{"class":671},"\u002F\u002F Solo interrumpimos a uno\n",[410,1204,1205],{"class":412,"line":743},[410,1206,1207],{"class":420},"                    }\n",[410,1209,1210],{"class":412,"line":748},[410,1211,740],{"class":420},[410,1213,1214,1217,1219,1221,1223],{"class":412,"line":784},[410,1215,1216],{"class":420},"            } ",[410,1218,888],{"class":416},[410,1220,891],{"class":420},[410,1222,894],{"class":509},[410,1224,522],{"class":420},[410,1226,1227,1230,1232,1234,1237],{"class":412,"line":841},[410,1228,1229],{"class":420},"                System.err.",[410,1231,592],{"class":440},[410,1233,595],{"class":420},[410,1235,1236],{"class":598},"\"Gerente interrumpido mientras esperaba.\"",[410,1238,624],{"class":420},[410,1240,1241],{"class":412,"line":853},[410,1242,856],{"class":420},[410,1244,1245],{"class":412,"line":859},[410,1246,1247],{"class":420},"        });\n",[410,1249,1250,1253,1255],{"class":412,"line":882},[410,1251,1252],{"class":420},"        gerente.",[410,1254,1065],{"class":440},[410,1256,490],{"class":420},[410,1258,1259],{"class":412,"line":899},[410,1260,428],{"emptyLinePlaceholder":427},[410,1262,1263],{"class":412,"line":921},[410,1264,1265],{"class":671},"        \u002F\u002F Esperar a que todos los chefs terminen\n",[410,1267,1268,1270,1272,1274],{"class":412,"line":927},[410,1269,1048],{"class":416},[410,1271,1051],{"class":420},[410,1273,1054],{"class":416},[410,1275,1057],{"class":420},[410,1277,1278,1280],{"class":412,"line":933},[410,1279,1104],{"class":416},[410,1281,450],{"class":420},[410,1283,1284,1287,1290],{"class":412,"line":938},[410,1285,1286],{"class":420},"                c.",[410,1288,1289],{"class":440},"join",[410,1291,490],{"class":420},[410,1293,1295,1297,1299,1301,1303],{"class":412,"line":1294},35,[410,1296,1216],{"class":420},[410,1298,888],{"class":416},[410,1300,891],{"class":420},[410,1302,894],{"class":509},[410,1304,522],{"class":420},[410,1306,1308,1310,1312,1314,1317,1319,1321,1323],{"class":412,"line":1307},36,[410,1309,1229],{"class":420},[410,1311,592],{"class":440},[410,1313,595],{"class":420},[410,1315,1316],{"class":598},"\"Main interrumpido mientras esperaba a \"",[410,1318,602],{"class":416},[410,1320,1169],{"class":420},[410,1322,1172],{"class":440},[410,1324,1325],{"class":420},"());\n",[410,1327,1329],{"class":412,"line":1328},37,[410,1330,856],{"class":420},[410,1332,1334],{"class":412,"line":1333},38,[410,1335,930],{"class":420},[410,1337,1339],{"class":412,"line":1338},39,[410,1340,428],{"emptyLinePlaceholder":427},[410,1342,1344,1347,1349,1351,1354],{"class":412,"line":1343},40,[410,1345,1346],{"class":420},"        System.out.",[410,1348,592],{"class":440},[410,1350,595],{"class":420},[410,1352,1353],{"class":598},"\"Main: Todos los chefs han finalizado. ¡A servir la comida!\"",[410,1355,624],{"class":420},[410,1357,1359],{"class":412,"line":1358},41,[410,1360,555],{"class":420},[410,1362,1364],{"class":412,"line":1363},42,[410,1365,941],{"class":420},[1367,1368,1370],"h3",{"id":1369},"explicación-paso-a-paso-del-código-base","Explicación paso a paso del código base",[333,1372,1373,1390],{},[326,1374,1375,1376],{},"Clase Chef:",[333,1377,1378,1381,1384,1387],{},[326,1379,1380],{},"Almacena el nombre y el número de pasos.",[326,1382,1383],{},"En run(), itera sobre los pasos. Antes de cada paso comprueba si ha sido interrumpido; si es así, termina.",[326,1385,1386],{},"Simula cada paso con Thread.sleep() y muestra mensajes.",[326,1388,1389],{},"Captura InterruptedException para el caso de que la interrupción ocurra durante el sueño.",[326,1391,1392,1393],{},"Clase Cocina (main):",[333,1394,1395,1398,1401,1404],{},[326,1396,1397],{},"Crea un array de chefs y los inicia.",[326,1399,1400],{},"Crea un hilo gerente que espera 5 segundos y luego interrumpe al primer chef vivo que encuentre.",[326,1402,1403],{},"El main hace join() sobre cada chef para asegurarse de que todos terminan antes de continuar.",[326,1405,1406],{},"Finalmente imprime un mensaje.",[308,1408,1410],{"id":1409},"entrega","Entrega",[304,1412,1413],{},"Para la entrega de la actividad deberán integrar en un único archivo PDF los siguientes elementos:",[323,1415,1416,1419,1422,1425],{},[326,1417,1418],{},"Portada con el título de la actividad, nombre de los integrantes del equipo con sus respectivos números de control.",[326,1420,1421],{},"Código fuente completo del programa, incluyendo las modificaciones adicionales.",[326,1423,1424],{},"Capturas de pantalla que muestren la ejecución del programa, evidenciando la interrupción de los chefs y la finalización de todos los hilos.",[326,1426,1427,1428],{},"Reflexión contestando las siguientes preguntas:\n",[333,1429,1430,1433,1436,1439],{},[326,1431,1432],{},"¿Por qué es necesario verificar isInterrupted() antes de cada paso si ya manejamos InterruptedException?",[326,1434,1435],{},"¿Qué sucede si el gerente intenta interrumpir a un chef que ya terminó?",[326,1437,1438],{},"¿Cómo podríamos hacer para que el chef, al ser interrumpido, termine el paso actual antes de salir?",[326,1440,1441],{},"¿Qué ventajas tiene la cancelación cooperativa frente a una detención forzosa?",[304,1443,1444],{},"Recuerda que el código debe estar bien comentado y organizado para facilitar su comprensión. La reflexión debe ser clara y concisa, demostrando una comprensión profunda de los conceptos de concurrencia y manejo de hilos en Java.",[1446,1447,1448],"warning",{},"Recuerda que integrante que no se encuentre en la portada no será considerado para la evaluación, por lo que es importante que todos los integrantes del equipo estén correctamente listados en la portada del documento.",[1450,1451,1452],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":405,"searchDepth":424,"depth":424,"links":1454},[1455,1456,1457,1460],{"id":310,"depth":424,"text":311},{"id":320,"depth":424,"text":321},{"id":397,"depth":424,"text":398,"children":1458},[1459],{"id":1369,"depth":431,"text":1370},{"id":1409,"depth":424,"text":1410},"md",null,{"editButton":104},{"icon":83},{"title":283,"description":306},"l-d7hhdSRcpoMqhtYJ6wlIbINGDa9OPaW_NxSIqh9J4",[1468,1470],{"title":279,"path":280,"stem":281,"description":1469,"icon":83,"children":-1},"Explicar conceptos de concurrencia de manera sencilla",{"title":287,"path":288,"stem":289,"description":1471,"icon":83,"children":-1},"En esta actividad, simularás un sistema de retiro bancario donde múltiples clientes (hilos) intentan retirar dinero de una cuenta compartida. Deberás implementar la sincronización adecuada para evitar condiciones de carrera y garantizar que el saldo de la cuenta se actualice correctamente.",1775101377378]