multithreading - Java Unisex Bathroom monitor -


i have solve problem monitor locks. did code need advice logic. in output example seems checks case of 1 person occupied bathroom , other 1 waiting turn (i'm sorry english, trying discribe can). here output:

man 0 enters bathroom man 0 in bathroom man 0 exits bathroom man 0 enters bathroom man 0 in bathroom man 0 exits bathroom woman 1 enters bathroom woman 1 in bathroom man 2 in waiting------------>>>> woman 1 exits bathroom man 2 in bathroom man 2 exits bathroom woman 2 enters bathroom woman 2 in bathroom woman 2 exits bathroom

and here code of 4 functions.

public void woman_wants_to_enter(int i) throws interruptedexception {      lock.lock();     try {          if (occupiedcount < numberoftoilets) {              if (menusingn == 0) {                  if (womenwaitingn == 0) {                     system.out.println("woman " + + " enters bathroom ");                     womenusingn++;                     occupiedcount++;                 } else {                     while (womenwaitingn != 0) {                         system.out.println("woman " + + " in waiting------------>>>>");                         womenwaitingn++;                         womenwaitingqueue.await();                     }                 }             } else {                 while (menusingn != 0) {                     system.out.println("woman " + + " in waiting------------>>>>");                     womenwaitingn++;                     womenwaitingqueue.await();                 }             }          } else {             while (occupiedcount == numberoftoilets) {                 system.out.println("woman " + + " in waiting------------>>>>");                 womenwaitingn++;                 womenwaitingqueue.await();             }         }      } {         lock.unlock();     } }  public void woman_leaves(int i) throws interruptedexception {      lock.lock();     try {          womenusingn--;         occupiedcount--;         system.out.println("woman " + + " exits bathroom ");          if (womenwaitingn > 0) {             womenwaitingqueue.signal();             womenusingn++;             occupiedcount++;             womenwaitingn--;         } else if (menwaitingn > 0 && womenusingn == 0) {             menwaitingqueue.signal();             menusingn++;             occupiedcount++;             menwaitingn--;         }      } {         lock.unlock();     }  }  public void man_wants_to_enter(int i) throws interruptedexception {     lock.lock();     try {          if (occupiedcount < numberoftoilets) {              if (womenusingn == 0) {                  if (womenwaitingn > 0) {                     womenwaitingqueue.signal();                     womenusingn++;                     occupiedcount++;                     womenwaitingn--;                 } else {                     menusingn++;                     occupiedcount++;                     system.out.println("man " + + " enters bathroom ");                     menwaitingqueue.signal();                 }             } else {                 while (womenusingn != 0) {                     system.out.println("man " + + " in waiting------------>>>>");                     menwaitingn++;                     menwaitingqueue.await();                 }             }          } else {             while (occupiedcount == numberoftoilets) {                 system.out.println("man " + + " in waiting------------>>>>");                 menwaitingn++;                 menwaitingqueue.await();             }         }      } {         lock.unlock();     } }  public void man_leaves(int i) throws interruptedexception {     lock.lock();     try {          menusingn--;         occupiedcount--;         system.out.println("man " + + " exits bathroom ");          if (womenwaitingn > 0 && menusingn == 0) {             womenwaitingqueue.signal();             womenusingn++;             occupiedcount++;             womenwaitingn--;         } else if (menwaitingn > 0) {             menwaitingqueue.signal();             menwaitingn--;             menusingn++;             occupiedcount++;         }     } {         lock.unlock();     } } 

i'll appreciate advice btw numberoftoilets=3;

    private lock lock = new reentrantlock(); private condition womenwaitingqueue = lock.newcondition(); private condition menwaitingqueue = lock.newcondition();  private int womenwaitingn = 0; private int menwaitingn = 0; private int womenusingn = 0; private int menusingn = 0; private int numberoftoilets; private int occupiedcount;  public bathroom(int numberoftoilets, int occupiedcount) {     this.numberoftoilets = numberoftoilets;     this.occupiedcount = occupiedcount; } 

main function

    public static void main(string args[]) {      thread[] women = new thread[3];     thread[] men = new thread[3];     int numberoftoilets = 3;     int occupiedcount = 0;     bathroom thebathroom = new bathroom(numberoftoilets, occupiedcount);      (int = 0; < 3; i++)         women[i] = new thread(new woman(i, thebathroom));      (int = 0; < 3; i++)         men[i] = new thread(new man(i, thebathroom));      (int = 0; < 3; i++)         women[i].start();      (int = 0; < 3; i++)         men[i].start(); } 

woman class

class woman implements runnable { private int n; /* identifies woman. */ private bathroom thebathroom;  public woman(int n, bathroom b) {     this.n = n;     this.thebathroom = b; }  public void run() {     (int = 0; < 3; i++) {         try {             thread.sleep((long) (500 * math.random()));         } catch (interruptedexception e) {         }         try {             thebathroom.woman_wants_to_enter(n);         } catch (interruptedexception e) {             e.printstacktrace();         }         system.out.println("woman " + n + " in bathroom ");         try {             thread.sleep((long) (500 * math.random()));         } catch (interruptedexception e) {         }         try {             thebathroom.woman_leaves(n);         } catch (interruptedexception e) {             e.printstacktrace();         }     } } 

} man class

class man implements runnable { private int n; /* identifies man */ private bathroom thebathroom;  public man(int n, bathroom b) {     this.n = n;     this.thebathroom = b; }  public void run() {     (int = 0; < 3; i++) {          try {             thread.sleep((long) (500 * math.random()));         } catch (interruptedexception e) {         }          try {             thebathroom.man_wants_to_enter(n);         } catch (interruptedexception e) {             e.printstacktrace();         }         system.out.println("man " + n + " in bathroom ");         try {             thread.sleep((long) (500 * math.random()));         } catch (interruptedexception e) {         }         try {             thebathroom.man_leaves(n);         } catch (interruptedexception e) {             e.printstacktrace();         }     } } 

}

your code shows men , women should not enter bathroom @ same time. seams work fine if persons of different gender want enter. try if it's working if several person of same gender want enter bathroom.


Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -