An example in java for Producer-Consumer problem using wait() and notify() :
/** * * @author vikky.agrawal */ public class Threads { public static void main(String args[]) { Semaphore mutex = new Semaphore(); Producer producer = new Producer(mutex); Consumer consumer = new Consumer(mutex); System.out.println("Main starts"); producer.start(); consumer.start(); try { consumer.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Main Stop"); } } class Consumer extends Thread { Semaphore mutex; Consumer(Semaphore mutex) { super("Consumer"); this.mutex = mutex; } @Override public void run() { for (int i = 0; i < 50; i++) { try { sleep(1000); mutex.down(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Producer extends Thread { Semaphore mutex; Producer(Semaphore mutex) { super("producer"); this.mutex = mutex; } @Override public void run() { for (int i = 0; i < 100; i++) { mutex.up(); try { sleep(10); } catch (InterruptedException e) { } } } } class Semaphore { static int value = 0; boolean available = false; public synchronized void down() { while (!available) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } // System.out.println("Consumer woke up from waiting"); } value--; System.out.println("Consumed now value : " + value); available = false; notify(); } public synchronized void up() { while (available) { try { wait(); // System.out.println("Producer Got a notification and available is now: "+available); } catch (InterruptedException e) { e.printStackTrace(); } // System.out.println("Producer woke up from waiting"); } value++; System.out.println("Produced now value :" + value); available = true; notify(); } }