java - Why is my release() method not waking my instance? -


i've written example program demonstrate problem. there's bartender thread , 3 customer threads. run @ same time once created. bartender suppose serve each customer drink.

my problem wait() method within bartender classes run() method never awakens. had intended release() method within run() method of each customer class awaken doesn't seem working. never awakens.

how can go fixing this? can offer advice or code snippets.

import java.util.concurrent.semaphore; import java.util.logging.level; import java.util.logging.logger;  public class bar {      semaphore serving;     boolean isserving = false;      public static void main(string[] args) {         bar bar = new bar();         bar.run();     }      public void run() {         serving = new semaphore(1);         thread bartender = new thread(new bartender());         bartender.start();         threadsleep(1000);          thread customer1 = new thread(new customer());         customer1.start();         threadsleep(2000);         thread customer2 = new thread(new customer());         customer2.start();         threadsleep(2000);         thread customer3 = new thread(new customer());         customer3.start();     }      public void threadsleep(int time) {         try {             thread.sleep(time);         } catch (interruptedexception ex) {             logger.getlogger(bar.class.getname()).log(level.severe, null, ex);         }     }      public class bartender implements runnable {         public void run() {             while (true) {                 if (serving.availablepermits() == 0) {                     synchronized (this) {                         try {                             system.out.println("waiting customer notify");                             wait();                             system.out.println("serve drink");                         } catch (interruptedexception ex) {                             logger.getlogger(bar.class.getname()).log(level.severe, null, ex);                         }                     }                 }             }         }     }      public class customer implements runnable {         private boolean customerserved = false;          public void run() {             if (!customerserved) {                 synchronized (this) {                     try {                         serving.acquire();                         if (serving.availablepermits() == 0 && !serving.hasqueuedthreads()) {                             notify();                             isserving = true;                             system.out.println("customer: recieves drink");                             customerserved = true;                             serving.release();                             isserving = false;                         }                     } catch (interruptedexception ex) {                         logger.getlogger(bar.class.getname()).log(level.severe, null, ex);                     }                 }             }         }     } } 

in class bartender , class customer

change synchronized (this) { synchronized (bar.this) {

change wait() bar.this.wait()

change notify() bar.this.notify()

because 2 this refer different object, bartender never wakes up. , because 2 bar.this refer same object, bartender wake up!


Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -