Channels ▼
RSS

Threads 101


Java Solutions June 2001/import java.*/Listing 13

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 —

Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.