[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"navigation_docs":3,"-actividades-act-07":298,"-actividades-act-07-surround":1079},[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":287,"body":300,"description":1072,"extension":1073,"links":1074,"meta":1075,"navigation":1076,"path":288,"seo":1077,"stem":289,"__hash__":1078},"docs\u002F8.actividades\u002F07.act-07.md",{"type":301,"value":302,"toc":1064},"minimark",[303,308,312,315,318,321,325,585,745,847,851,898,934,938,942,952,956,959,973,977,1048,1051,1054,1060],[304,305,307],"h2",{"id":306},"descripción-de-la-actividad","Descripción de la Actividad",[309,310,311],"p",{},"Se desea simular un sistema de retiro bancario donde múltiples cajeros automáticos (threads) realizan retiros de una misma cuenta bancaria.",[309,313,314],{},"Problema:",[309,316,317],{},"Si varios cajeros descuentan dinero al mismo tiempo, el saldo puede volverse incorrecto debido a condiciones de carrera.",[309,319,320],{},"El sistema debe garantizar que solo un hilo modifique el saldo a la vez utilizando semáforos.",[304,322,324],{"id":323},"código-base-de-ejemplo","Código base de ejemplo",[326,327,332],"pre",{"className":328,"code":329,"language":330,"meta":331,"style":331},"language-java shiki shiki-themes github-dark","public class BankAccount {\n\n    private int balance = 1000;\n\n    public void withdraw(int amount) {\n        if (balance >= amount) {\n\n            IO.println(Thread.currentThread().getName() +\n                    \" esta retirando: \" + amount);\n\n            balance = balance - amount;\n\n            IO.println(\"Saldo restante: \" + balance);\n        }\n        else {\n            IO.println(\"Fondos insuficientes para \" + Thread.currentThread().getName() +\n                    \" al intentar retirar: \" + amount);\n        }\n    }\n}\n","java","",[333,334,335,355,362,384,389,414,429,434,461,474,479,495,500,517,523,531,558,568,573,579],"code",{"__ignoreMap":331},[336,337,340,344,347,351],"span",{"class":338,"line":339},"line",1,[336,341,343],{"class":342},"snl16","public",[336,345,346],{"class":342}," class",[336,348,350],{"class":349},"svObZ"," BankAccount",[336,352,354],{"class":353},"s95oV"," {\n",[336,356,358],{"class":338,"line":357},2,[336,359,361],{"emptyLinePlaceholder":360},true,"\n",[336,363,365,368,371,374,377,381],{"class":338,"line":364},3,[336,366,367],{"class":342},"    private",[336,369,370],{"class":342}," int",[336,372,373],{"class":353}," balance ",[336,375,376],{"class":342},"=",[336,378,380],{"class":379},"sDLfK"," 1000",[336,382,383],{"class":353},";\n",[336,385,387],{"class":338,"line":386},4,[336,388,361],{"emptyLinePlaceholder":360},[336,390,392,395,398,401,404,407,411],{"class":338,"line":391},5,[336,393,394],{"class":342},"    public",[336,396,397],{"class":342}," void",[336,399,400],{"class":349}," withdraw",[336,402,403],{"class":353},"(",[336,405,406],{"class":342},"int",[336,408,410],{"class":409},"s9osk"," amount",[336,412,413],{"class":353},") {\n",[336,415,417,420,423,426],{"class":338,"line":416},6,[336,418,419],{"class":342},"        if",[336,421,422],{"class":353}," (balance ",[336,424,425],{"class":342},">=",[336,427,428],{"class":353}," amount) {\n",[336,430,432],{"class":338,"line":431},7,[336,433,361],{"emptyLinePlaceholder":360},[336,435,437,440,443,446,449,452,455,458],{"class":338,"line":436},8,[336,438,439],{"class":353},"            IO.",[336,441,442],{"class":349},"println",[336,444,445],{"class":353},"(Thread.",[336,447,448],{"class":349},"currentThread",[336,450,451],{"class":353},"().",[336,453,454],{"class":349},"getName",[336,456,457],{"class":353},"() ",[336,459,460],{"class":342},"+\n",[336,462,464,468,471],{"class":338,"line":463},9,[336,465,467],{"class":466},"sU2Wk","                    \" esta retirando: \"",[336,469,470],{"class":342}," +",[336,472,473],{"class":353}," amount);\n",[336,475,477],{"class":338,"line":476},10,[336,478,361],{"emptyLinePlaceholder":360},[336,480,482,485,487,489,492],{"class":338,"line":481},11,[336,483,484],{"class":353},"            balance ",[336,486,376],{"class":342},[336,488,373],{"class":353},[336,490,491],{"class":342},"-",[336,493,494],{"class":353}," amount;\n",[336,496,498],{"class":338,"line":497},12,[336,499,361],{"emptyLinePlaceholder":360},[336,501,503,505,507,509,512,514],{"class":338,"line":502},13,[336,504,439],{"class":353},[336,506,442],{"class":349},[336,508,403],{"class":353},[336,510,511],{"class":466},"\"Saldo restante: \"",[336,513,470],{"class":342},[336,515,516],{"class":353}," balance);\n",[336,518,520],{"class":338,"line":519},14,[336,521,522],{"class":353},"        }\n",[336,524,526,529],{"class":338,"line":525},15,[336,527,528],{"class":342},"        else",[336,530,354],{"class":353},[336,532,534,536,538,540,543,545,548,550,552,554,556],{"class":338,"line":533},16,[336,535,439],{"class":353},[336,537,442],{"class":349},[336,539,403],{"class":353},[336,541,542],{"class":466},"\"Fondos insuficientes para \"",[336,544,470],{"class":342},[336,546,547],{"class":353}," Thread.",[336,549,448],{"class":349},[336,551,451],{"class":353},[336,553,454],{"class":349},[336,555,457],{"class":353},[336,557,460],{"class":342},[336,559,561,564,566],{"class":338,"line":560},17,[336,562,563],{"class":466},"                    \" al intentar retirar: \"",[336,565,470],{"class":342},[336,567,473],{"class":353},[336,569,571],{"class":338,"line":570},18,[336,572,522],{"class":353},[336,574,576],{"class":338,"line":575},19,[336,577,578],{"class":353},"    }\n",[336,580,582],{"class":338,"line":581},20,[336,583,584],{"class":353},"}\n",[326,586,588],{"className":328,"code":587,"language":330,"meta":331,"style":331},"public class ATMThread extends Thread {\n\n    private BankAccount account;\n\n    public ATMThread(BankAccount account, String name) {\n        super(name);\n        this.account = account;\n    }\n\n    public void run() {\n        for(int i = 0; i \u003C 3; i++) {\n            account.withdraw(200);\n        }\n    }\n}\n",[333,589,590,607,611,618,622,642,650,663,667,671,683,717,733,737,741],{"__ignoreMap":331},[336,591,592,594,596,599,602,605],{"class":338,"line":339},[336,593,343],{"class":342},[336,595,346],{"class":342},[336,597,598],{"class":349}," ATMThread",[336,600,601],{"class":342}," extends",[336,603,604],{"class":349}," Thread",[336,606,354],{"class":353},[336,608,609],{"class":338,"line":357},[336,610,361],{"emptyLinePlaceholder":360},[336,612,613,615],{"class":338,"line":364},[336,614,367],{"class":342},[336,616,617],{"class":353}," BankAccount account;\n",[336,619,620],{"class":338,"line":386},[336,621,361],{"emptyLinePlaceholder":360},[336,623,624,626,628,631,634,637,640],{"class":338,"line":391},[336,625,394],{"class":342},[336,627,598],{"class":349},[336,629,630],{"class":353},"(BankAccount ",[336,632,633],{"class":409},"account",[336,635,636],{"class":353},", String ",[336,638,639],{"class":409},"name",[336,641,413],{"class":353},[336,643,644,647],{"class":338,"line":416},[336,645,646],{"class":379},"        super",[336,648,649],{"class":353},"(name);\n",[336,651,652,655,658,660],{"class":338,"line":431},[336,653,654],{"class":379},"        this",[336,656,657],{"class":353},".account ",[336,659,376],{"class":342},[336,661,662],{"class":353}," account;\n",[336,664,665],{"class":338,"line":436},[336,666,578],{"class":353},[336,668,669],{"class":338,"line":463},[336,670,361],{"emptyLinePlaceholder":360},[336,672,673,675,677,680],{"class":338,"line":476},[336,674,394],{"class":342},[336,676,397],{"class":342},[336,678,679],{"class":349}," run",[336,681,682],{"class":353},"() {\n",[336,684,685,688,690,692,695,697,700,703,706,709,712,715],{"class":338,"line":481},[336,686,687],{"class":342},"        for",[336,689,403],{"class":353},[336,691,406],{"class":342},[336,693,694],{"class":353}," i ",[336,696,376],{"class":342},[336,698,699],{"class":379}," 0",[336,701,702],{"class":353},"; i ",[336,704,705],{"class":342},"\u003C",[336,707,708],{"class":379}," 3",[336,710,711],{"class":353},"; i",[336,713,714],{"class":342},"++",[336,716,413],{"class":353},[336,718,719,722,725,727,730],{"class":338,"line":497},[336,720,721],{"class":353},"            account.",[336,723,724],{"class":349},"withdraw",[336,726,403],{"class":353},[336,728,729],{"class":379},"200",[336,731,732],{"class":353},");\n",[336,734,735],{"class":338,"line":502},[336,736,522],{"class":353},[336,738,739],{"class":338,"line":519},[336,740,578],{"class":353},[336,742,743],{"class":338,"line":525},[336,744,584],{"class":353},[326,746,748],{"className":328,"code":747,"language":330,"meta":331,"style":331},"void main() {\n\n    BankAccount account = new BankAccount();\n\n    ATMThread atm1 = new ATMThread(account, \"ATM 1\");\n    ATMThread atm2 = new ATMThread(account, \"ATM 2\");\n\n    atm1.start();\n    atm2.start();\n}\n",[333,749,750,760,764,779,783,802,820,824,834,843],{"__ignoreMap":331},[336,751,752,755,758],{"class":338,"line":339},[336,753,754],{"class":342},"void",[336,756,757],{"class":349}," main",[336,759,682],{"class":353},[336,761,762],{"class":338,"line":357},[336,763,361],{"emptyLinePlaceholder":360},[336,765,766,769,771,774,776],{"class":338,"line":364},[336,767,768],{"class":353},"    BankAccount account ",[336,770,376],{"class":342},[336,772,773],{"class":342}," new",[336,775,350],{"class":349},[336,777,778],{"class":353},"();\n",[336,780,781],{"class":338,"line":386},[336,782,361],{"emptyLinePlaceholder":360},[336,784,785,788,790,792,794,797,800],{"class":338,"line":391},[336,786,787],{"class":353},"    ATMThread atm1 ",[336,789,376],{"class":342},[336,791,773],{"class":342},[336,793,598],{"class":349},[336,795,796],{"class":353},"(account, ",[336,798,799],{"class":466},"\"ATM 1\"",[336,801,732],{"class":353},[336,803,804,807,809,811,813,815,818],{"class":338,"line":416},[336,805,806],{"class":353},"    ATMThread atm2 ",[336,808,376],{"class":342},[336,810,773],{"class":342},[336,812,598],{"class":349},[336,814,796],{"class":353},[336,816,817],{"class":466},"\"ATM 2\"",[336,819,732],{"class":353},[336,821,822],{"class":338,"line":431},[336,823,361],{"emptyLinePlaceholder":360},[336,825,826,829,832],{"class":338,"line":436},[336,827,828],{"class":353},"    atm1.",[336,830,831],{"class":349},"start",[336,833,778],{"class":353},[336,835,836,839,841],{"class":338,"line":463},[336,837,838],{"class":353},"    atm2.",[336,840,831],{"class":349},[336,842,778],{"class":353},[336,844,845],{"class":338,"line":476},[336,846,584],{"class":353},[304,848,850],{"id":849},"tareas-a-realizar","Tareas a Realizar",[852,853,854,862,868,871,874,889,892,895],"ol",{},[855,856,857,858,861],"li",{},"Analiza el código base y explica por qué puede haber problemas de concurrencia al ejecutar los hilos ",[333,859,860],{},"ATMThread"," sin sincronización.",[855,863,864,865,867],{},"Implementa un mecanismo de sincronización utilizando semáforos para asegurar que solo un hilo pueda acceder al método ",[333,866,724],{}," a la vez.",[855,869,870],{},"Modifica el código para que cada hilo intente retirar una cantidad aleatoria entre 100 y 300 en cada iteración, y ejecuta el programa varias veces para observar cómo se comporta el sistema con la sincronización implementada.",[855,872,873],{},"Agrega un contador de intentos de retiro exitosos y fallidos para cada hilo, e imprímelo al finalizar la ejecución de cada hilo.",[855,875,876,877],{},"Responde a las siguientes preguntas:\n",[878,879,880,883,886],"ul",{},[855,881,882],{},"¿Qué sucede si no se utiliza un mecanismo de sincronización en este escenario?",[855,884,885],{},"¿Cómo garantiza el uso de semáforos que el saldo de la cuenta se actualice correctamente?",[855,887,888],{},"¿Qué otras alternativas de sincronización podrían haberse utilizado en este caso y por qué?",[855,890,891],{},"Para realizar de una forma más realista, agrega un tiempo de espera aleatorio entre los retiros para simular el tiempo que tarda cada cliente en realizar su transacción.",[855,893,894],{},"Para la implementación es necesario crear una interfaz gráfica que muestre el saldo de la cuenta en tiempo real, así como los intentos de retiro exitosos y fallidos de cada hilo.",[855,896,897],{},"Recuerda implementar la biblioteca de componentes que has utilizado en actividades anteriores para crear la interfaz gráfica y extenderla para mostrar la información requerida con nuevos componentes y delegators necesarios.",[899,900,901,904],"note",{},[309,902,903],{},"Los componentes recomendados para la interfaz gráfica son:",[878,905,906,912,922,928],{},[855,907,908,911],{},[333,909,910],{},"Label"," para mostrar el saldo de la cuenta.",[855,913,914,917,918,921],{},[333,915,916],{},"List"," o ",[333,919,920],{},"TextArea"," para mostrar los intentos de retiro exitosos y fallidos de cada hilo.",[855,923,924,927],{},[333,925,926],{},"Button"," para iniciar la simulación de los retiros.",[855,929,930,933],{},[333,931,932],{},"Timer"," para actualizar el saldo de la cuenta en tiempo real.",[935,936,937],"warning",{},"Recuerda que deberás comentar cada parte de tu código para explicar su funcionamiento, especialmente la parte relacionada con la sincronización utilizando semáforos. Toma en cuenta que los bloques JavaDoc son una excelente manera de documentar tus métodos y clases, proporcionando una descripción clara de su propósito y funcionamiento.",[304,939,941],{"id":940},"recomendaciones","Recomendaciones",[878,943,944,947,950],{},[855,945,946],{},"Asegúrate de manejar correctamente las excepciones que puedan surgir al trabajar con semáforos.",[855,948,949],{},"Prueba tu implementación con diferentes cantidades de hilos y retiros para verificar que el sistema se comporta de manera correcta y que el saldo de la cuenta se actualiza adecuadamente sin condiciones de carrera.",[855,951],{},[304,953,955],{"id":954},"entrega","Entrega",[309,957,958],{},"Para la entrega deberás subir tu código completo con la implementación de la sincronización utilizando semáforos, así como un único documento PDF que contenga:",[878,960,961,964,967,970],{},[855,962,963],{},"Portada con nombre de los integrantes del equipo, nombre de la actividad y fecha de entrega.",[855,965,966],{},"Respuestas a las preguntas planteadas en la sección de tareas.",[855,968,969],{},"Capturas de pantalla que evidencien la correcta ejecución del programa, mostrando los intentos de retiro exitosos y fallidos, así como el saldo actualizado de la cuenta después de cada retiro.",[855,971,972],{},"Reflexión final sobre la importancia de la sincronización en sistemas concurrentes y cómo el uso de semáforos contribuye a evitar problemas de concurrencia en este tipo de escenarios.",[304,974,976],{"id":975},"lista-de-cotejo-para-evaluación","Lista de cotejo para evaluación",[978,979,980,993],"table",{},[981,982,983],"thead",{},[984,985,986,990],"tr",{},[987,988,989],"th",{},"Criterio",[987,991,992],{},"Puntaje",[994,995,996,1005,1012,1020,1027,1034,1041],"tbody",{},[984,997,998,1002],{},[999,1000,1001],"td",{},"Utiliza correctamente acquire() y release()",[999,1003,1004],{},"10 puntos",[984,1006,1007,1010],{},[999,1008,1009],{},"Implementación de la interfaz gráfica para mostrar el saldo y los intentos de retiro",[999,1011,1004],{},[984,1013,1014,1017],{},[999,1015,1016],{},"Respuestas claras y completas a las preguntas planteadas",[999,1018,1019],{},"20 puntos",[984,1021,1022,1025],{},[999,1023,1024],{},"Capturas de pantalla que evidencien la correcta ejecución del programa",[999,1026,1019],{},[984,1028,1029,1032],{},[999,1030,1031],{},"Reflexión final sobre la importancia de la sincronización",[999,1033,1019],{},[984,1035,1036,1039],{},[999,1037,1038],{},"Documentación y comentarios en el código",[999,1040,1004],{},[984,1042,1043,1046],{},[999,1044,1045],{},"Presentación en clase explicando la implementación y resultados obtenidos",[999,1047,1004],{},[309,1049,1050],{},"Para efectos de la entrega, se realizará una presentación en clase donde cada equipo explicará su implementación, las decisiones tomadas y los resultados obtenidos. Se evaluará la claridad de la explicación, la calidad del código y la capacidad de cada uno de los miembros del equipo para responder preguntas relacionadas con la actividad.",[309,1052,1053],{},"Recuerda que la presentación debe ser clara y concisa, enfocándose en los aspectos más relevantes de la implementación y los resultados obtenidos.",[309,1055,1056],{},[1057,1058,1059],"strong",{},"Es importante recalcar que la presentación es una parte fundamental de la evaluación y requisito para la entrega de la actividad, ya que en caso de no presentarse, el equipo no podrá ser evaluado y, por lo tanto, se considerará como no entregada la actividad, independientemente de la calidad del código o la documentación presentada.",[1061,1062,1063],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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":331,"searchDepth":357,"depth":357,"links":1065},[1066,1067,1068,1069,1070,1071],{"id":306,"depth":357,"text":307},{"id":323,"depth":357,"text":324},{"id":849,"depth":357,"text":850},{"id":940,"depth":357,"text":941},{"id":954,"depth":357,"text":955},{"id":975,"depth":357,"text":976},"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.","md",null,{"editButton":104},{"icon":83},{"title":287,"description":1072},"vfh5TiolmH23BTkWolwXKNct_dARrGBVTWtBICu1IKQ",[1080,1082],{"title":283,"path":284,"stem":285,"description":1081,"icon":83,"children":-1},"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.",{"title":291,"path":292,"stem":293,"description":1083,"icon":83,"children":-1},"En esta actividad se implementará una simulación de un sistema de planificación Round Robin utilizando hilos en Java. Además, se creará una interfaz gráfica para visualizar el estado de los procesos en ejecución, los procesos en espera y el proceso actual. Esta actividad permitirá comprender mejor cómo funciona el algoritmo de planificación Round Robin y cómo se pueden utilizar hilos e interfaces gráficas para simular sistemas operativos.",1775101377504]