The document contains code for simulating bathroom access with multiple threads representing men and women. It defines thread classes for men and women that call methods on a bathroom monitor class to arrive and depart. The bathroom monitor class synchronizes access, only allowing one gender at a time and tracking the number of open spaces. The main method starts 10 threads that will continuously access the bathroom over time.
1. Código Fuente: (http://goo.gl/dFmzn2)
/************************************************************
* UNIVERSITARIA DE DESARROLLO E INVESTIGACIÓN - UDI *
* ============================== *
* GPL 2015 por Juan C. Garcia-Ojeda *
* Creado : Marzo 4 de 2015 *
* Modificado : Marzo 4 de 2015 *
* Estado : Actualizado *
* Archivo : WomenThread.java *
* Propósito : Solución problema propuesto en *
* http://www.slideshare.net/j.c.garciao/ejercicio-semaforo *
************************************************************/
package co.edu.udi.monitors;
public class WomenThread extends Thread {
String name = "";
String gender ="";
BanoMonitor bm;
public WomenThread(String name,
String gender,
BanoMonitor bm){
this.name=name;
this.gender=gender;
this.bm=bm;
}
public void run(){
while(true){
try {
bm.arrive(name,gender);
Thread.sleep(2500);
}
catch(InterruptedException e){
e.printStackTrace();
}
finally{
try {
bm.depart(name,gender);
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
2. /************************************************************
* UNIVERSITARIA DE DESARROLLO E INVESTIGACIÓN - UDI *
* ============================== *
* GPL 2015 por Juan C. Garcia-Ojeda *
* Creado : Marzo 4 de 2015 *
* Modificado : Marzo 4 de 2015 *
* Estado : Actualizado *
* Archivo : MenThread.java *
* Propósito : Solución problema propuesto en *
* http://www.slideshare.net/j.c.garciao/ejercicio-semaforo *
************************************************************/
package co.edu.udi.monitors;
public class MenThread extends Thread {
String name = "";
String gender ="";
BanoMonitor bm;
public MenThread(String name, String gender, BanoMonitor bm){
this.name=name;
this.gender=gender;
this.bm=bm;
}
public void run(){
while(true){
try {
bm.arrive(name,gender);
Thread.sleep(2500);
}
catch(InterruptedException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
bm.depart(name,gender);
Thread.sleep(2500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
3. /************************************************************
* UNIVERSITARIA DE DESARROLLO E INVESTIGACIÓN - UDI *
* ============================== *
* GPL 2015 por Juan C. Garcia-Ojeda *
* Creado : Marzo 4 de 2015 *
* Modificado : Marzo 4 de 2015 *
* Estado : Actualizado *
* Archivo : BanoMonitor.java *
* Propósito : Solución problema propuesto en *
* http://www.slideshare.net/j.c.garciao/ejercicio-semaforo *
************************************************************/
package co.edu.udi.monitors;
public class BanoMonitor {
protected int spaces;
protected int capacity;
protected String gender_monitor="";
public BanoMonitor(int n){
capacity = spaces = n;
}
synchronized void arrive(String persona,String gender)
throws InterruptedException {
while(spaces==0 ||
(spaces!=0 && gender_monitor.length()>0 &&
gender_monitor.compareTo(gender)!=0)) wait();
System.out.println("--> Arribo "+persona);
gender_monitor=gender;
--spaces;
System.out.println("Espacios Ocupados "+
(capacity-spaces));
notify();
}
synchronized void depart(String persona, String gender)
throws InterruptedException {
while (spaces==capacity) wait();
System.out.println("<-- Salio "+persona);
++spaces;
System.out.println("Espacios Disponibles "+(spaces));
if(spaces==capacity){
gender_monitor="";
System.out.println("/* */");
System.out.println("/*Baño Totalmente Vacio */");
System.out.println("/* */");
}
notify();
}
}
4. /************************************************************
* UNIVERSITARIA DE DESARROLLO E INVESTIGACIÓN - UDI *
* ============================== *
* GPL 2015 por Juan C. Garcia-Ojeda *
* Creado : Marzo 4 de 2015 *
* Modificado : Marzo 4 de 2015 *
* Estado : Actualizado *
* Archivo : Principal.java *
* Propósito : Solución problema propuesto en *
* http://www.slideshare.net/j.c.garciao/ejercicio-semaforo *
************************************************************/
package co.edu.udi.monitors;
public class Principal {
public static void main(String[] args) throws
InterruptedException {
BanoMonitor bm= new BanoMonitor(4);
System.out.println("Inicialización...");
new MenThread("Pedro","H",bm).start();
new MenThread("Luis","H",bm).start();
new MenThread("Jose","H",bm).start();
new MenThread("Juan","H",bm).start();
new MenThread("Pablo","H",bm).start();
new WomenThread("Ana","M",bm).start();
new WomenThread("Rosa","M",bm).start();
new WomenThread("Maria","M",bm).start();
new WomenThread("Julia","M",bm).start();
new WomenThread("Juana","M",bm).start();
/*new MenThread("Pedro","H",bm).start();
new WomenThread("Ana","M",bm).start();
new MenThread("Luis","H",bm).start();
new WomenThread("Rosa","M",bm).start();
new MenThread("Jose","H",bm).start();
new WomenThread("Maria","M",bm).start();
new MenThread("Juan","H",bm).start();
new WomenThread("Julia","M",bm).start();
new WomenThread("Juana","M",bm).start();
new MenThread("Pablo","H",bm).start();*/
}
}