Listing 13: File CommTest.java: Illustrates thread communication with wait and notify

import java.util.*;

class Queue
{
   // The shared buffer:
   static Queue store = new Queue();

   private LinkedList data = new LinkedList();
    
   public void put(Object o)
   {
      data.addFirst(o);
   }
   public Object get()
   {
      return data.removeLast();
   }
   public int size()
   {
      return data.size();
   }
}

class Producer extends Thread
{
   static Random numbers = new Random();

   Producer(String id)
   {
      super(id);
   }

   int genNumber()
   {
      // Generate a random number in (0, 1000)
      return (int)(numbers.nextDouble()*1000);
   }

   public void run()
   {
      // Generate some elements for the Queue
      for (;;)
      {
         int number = genNumber();
         System.out.println(getName() + " producing " + number);
         synchronized(Queue.store)
         {
            Queue.store.put(new Integer(number));
            Queue.store.notify();
         }
      }
   }
}

class Consumer extends Thread
{
   Consumer(String id)
   {
      super(id);
   }

   public void run()
   {
      for (;;)
      {
         synchronized(Queue.store)
         {
            while (Queue.store.size() == 0)
            {
               try
               {
                  Queue.store.wait();
               }
               catch (InterruptedException x)
               {}
            }
            System.out.println(getName() + " consuming "
                               + Queue.store.get());
         }
      }
   }
}

class CommTest
{
   public static void main(String[] args)
   {
      // Start Producers
      new Producer("Producer1").start();
      new Producer("Producer2").start();

      // Start Consumers
      new Consumer("Consumer1").start();
      new Consumer("Consumer2").start();
   }
}

/* Output:
Producer1 producing 289
Producer1 producing 34
Producer1 producing 975
Producer1 producing 804
Producer1 producing 913
Producer1 producing 514
Producer1 producing 94
Producer1 producing 425
Producer2 producing 863
Consumer1 consuming 289
Consumer2 consuming 34
Producer2 producing 758
Consumer1 consuming 975
Consumer2 consuming 804
Producer2 producing 274
Consumer1 consuming 913
Consumer2 consuming 514
Producer2 producing 311
Consumer1 consuming 94
Consumer2 consuming 863
Producer2 producing 997
(etc...)
*/
— End of Listing —