<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FThreads%2FProducer_Consumer</id>
		<title>Java/Threads/Producer Consumer - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FThreads%2FProducer_Consumer"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Threads/Producer_Consumer&amp;action=history"/>
		<updated>2026-04-23T02:42:40Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Threads/Producer_Consumer&amp;diff=8317&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Threads/Producer_Consumer&amp;diff=8317&amp;oldid=prev"/>
				<updated>2010-06-01T06:58:54Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:58, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Threads/Producer_Consumer&amp;diff=8316&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Threads/Producer_Consumer&amp;diff=8316&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:46Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Fibonacci: producer and consumer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Java Threads, 3rd Edition&lt;br /&gt;
By Scott Oaks, Henry Wong&lt;br /&gt;
3rd Edition September 2004 &lt;br /&gt;
ISBN: 0-596-00782-5&lt;br /&gt;
*/&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.util.concurrent.*;&lt;br /&gt;
public class FibonacciTest {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        ArrayBlockingQueue&amp;lt;Integer&amp;gt; queue;&lt;br /&gt;
        queue = new ArrayBlockingQueue&amp;lt;Integer&amp;gt;(10);&lt;br /&gt;
        new FibonacciProducer(queue);&lt;br /&gt;
        int nThreads = Integer.parseInt(args[0]);&lt;br /&gt;
        for (int i = 0; i &amp;lt; nThreads; i++)&lt;br /&gt;
            new FibonacciConsumer(queue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Fibonacci {&lt;br /&gt;
    private ConcurrentMap&amp;lt;Integer, Integer&amp;gt; values =&lt;br /&gt;
              new ConcurrentHashMap&amp;lt;Integer, Integer&amp;gt;();&lt;br /&gt;
    public int calculate(int x) {&lt;br /&gt;
        if (x &amp;lt; 0)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;positive numbers only&amp;quot;);&lt;br /&gt;
        if (x &amp;lt;= 1)&lt;br /&gt;
            return x;&lt;br /&gt;
        return calculate(x-1) + calculate(x-2);&lt;br /&gt;
    }&lt;br /&gt;
    public int calculateWithCache(int x) {&lt;br /&gt;
        Integer key = new Integer(x);&lt;br /&gt;
        Integer result = values.get(key);&lt;br /&gt;
        if (result == null) {&lt;br /&gt;
            result = new Integer(calculate(x));&lt;br /&gt;
            values.putIfAbsent(key, result);&lt;br /&gt;
        }&lt;br /&gt;
        return result.intValue();                &lt;br /&gt;
    }&lt;br /&gt;
    public int calculateOnlyWithCache(int x) {&lt;br /&gt;
        Integer v1 = values.get(new Integer(x-1));&lt;br /&gt;
        Integer v2 = values.get(new Integer(x-2));&lt;br /&gt;
        Integer key = new Integer(x);&lt;br /&gt;
        Integer result = values.get(key);&lt;br /&gt;
        &lt;br /&gt;
        if (result != null)&lt;br /&gt;
            return result.intValue();&lt;br /&gt;
        if ((v1 == null) || (v2 == null))&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;values not in cache&amp;quot;);&lt;br /&gt;
        result = new Integer(v1.intValue() + v2.intValue());&lt;br /&gt;
        values.putIfAbsent(key, result);&lt;br /&gt;
        return result.intValue();&lt;br /&gt;
    }              &lt;br /&gt;
    public void calculateRangeInCache(int x, int y) {&lt;br /&gt;
        calculateWithCache(x++);&lt;br /&gt;
        calculateWithCache(x++);&lt;br /&gt;
        while (x &amp;lt;= y) {&lt;br /&gt;
            calculateOnlyWithCache(x++);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class FibonacciProducer implements Runnable {&lt;br /&gt;
    private Thread thr;&lt;br /&gt;
    private BlockingQueue&amp;lt;Integer&amp;gt; queue;&lt;br /&gt;
    public FibonacciProducer(BlockingQueue&amp;lt;Integer&amp;gt; q) {&lt;br /&gt;
        queue = q;&lt;br /&gt;
        thr = new Thread(this);&lt;br /&gt;
        thr.start();&lt;br /&gt;
    }&lt;br /&gt;
    public void run() {&lt;br /&gt;
        try {&lt;br /&gt;
            for(int x=0;;x++) {&lt;br /&gt;
                Thread.sleep(1000);&lt;br /&gt;
                queue.put(new Integer(x));&lt;br /&gt;
                System.out.println(&amp;quot;Produced request &amp;quot; + x);&lt;br /&gt;
            }&lt;br /&gt;
        } catch (InterruptedException ex) {&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class FibonacciConsumer implements Runnable {&lt;br /&gt;
    private Fibonacci fib = new Fibonacci();&lt;br /&gt;
    private Thread thr;&lt;br /&gt;
    private BlockingQueue&amp;lt;Integer&amp;gt; queue;&lt;br /&gt;
    public FibonacciConsumer(BlockingQueue&amp;lt;Integer&amp;gt; q) {&lt;br /&gt;
        queue = q;&lt;br /&gt;
        thr = new Thread(this);&lt;br /&gt;
        thr.start();&lt;br /&gt;
    }&lt;br /&gt;
    public void run() {&lt;br /&gt;
        int request, result;&lt;br /&gt;
        try {&lt;br /&gt;
            while (true) {&lt;br /&gt;
                request = queue.take().intValue();&lt;br /&gt;
                result = fib.calculateWithCache(request);&lt;br /&gt;
                System.out.println(&amp;quot;Calculated result of &amp;quot; + result + &amp;quot; from &amp;quot; + request);&lt;br /&gt;
            }&lt;br /&gt;
        } catch (InterruptedException ex) {&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Producer and Comsumer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ProducerComsumer extends Object {&lt;br /&gt;
  private Object slot;&lt;br /&gt;
  public ProducerComsumer() {&lt;br /&gt;
    slot = null; // null indicates empty&lt;br /&gt;
  }&lt;br /&gt;
  public synchronized void putIn(Object obj) &lt;br /&gt;
            throws InterruptedException {&lt;br /&gt;
    while ( slot != null ) {&lt;br /&gt;
      wait(); &lt;br /&gt;
    }&lt;br /&gt;
    slot = obj;  // put object into slot&lt;br /&gt;
    notifyAll(); // signal that slot has been filled&lt;br /&gt;
  }&lt;br /&gt;
  public synchronized Object takeOut() &lt;br /&gt;
            throws InterruptedException {&lt;br /&gt;
    while ( slot == null ) {&lt;br /&gt;
      wait(); // wait while slot is empty&lt;br /&gt;
    }&lt;br /&gt;
    Object obj = slot;&lt;br /&gt;
    slot = null; // mark slot as empty&lt;br /&gt;
    notifyAll(); // signal that slot is empty&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    final ProducerComsumer ch = new ProducerComsumer();&lt;br /&gt;
    Runnable runA = new Runnable() {&lt;br /&gt;
        public void run() {&lt;br /&gt;
          try {&lt;br /&gt;
            String str;&lt;br /&gt;
            Thread.sleep(500);&lt;br /&gt;
            str = &amp;quot;multithreaded&amp;quot;;&lt;br /&gt;
            ch.putIn(str);&lt;br /&gt;
            str = &amp;quot;programming&amp;quot;;&lt;br /&gt;
            ch.putIn(str);&lt;br /&gt;
            str = &amp;quot;with Java&amp;quot;;&lt;br /&gt;
            ch.putIn(str);&lt;br /&gt;
          } catch ( InterruptedException x ) {&lt;br /&gt;
            x.printStackTrace();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      };&lt;br /&gt;
    Runnable runB = new Runnable() {&lt;br /&gt;
        public void run() {&lt;br /&gt;
          try {&lt;br /&gt;
            Object obj;&lt;br /&gt;
            obj = ch.takeOut();&lt;br /&gt;
            System.out.println(&amp;quot;in run() - just took out: &amp;quot;&amp;quot; + &lt;br /&gt;
                obj + &amp;quot;&amp;quot;&amp;quot;);&lt;br /&gt;
            Thread.sleep(500);&lt;br /&gt;
            obj = ch.takeOut();&lt;br /&gt;
            System.out.println(&amp;quot;in run() - just took out: &amp;quot;&amp;quot; + &lt;br /&gt;
                obj + &amp;quot;&amp;quot;&amp;quot;);&lt;br /&gt;
            obj = ch.takeOut();&lt;br /&gt;
            System.out.println(&amp;quot;in run() - just took out: &amp;quot;&amp;quot; + &lt;br /&gt;
                obj + &amp;quot;&amp;quot;&amp;quot;);&lt;br /&gt;
          } catch ( InterruptedException x ) {&lt;br /&gt;
            x.printStackTrace();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      };&lt;br /&gt;
    Thread threadA = new Thread(runA, &amp;quot;threadA&amp;quot;);&lt;br /&gt;
    threadA.start();&lt;br /&gt;
    Thread threadB = new Thread(runB, &amp;quot;threadB&amp;quot;);&lt;br /&gt;
    threadB.start();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Producer consumer for J2SE 1.5 using concurrent ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import java.util.concurrent.*;&lt;br /&gt;
/** Producer-Consumer in Java, for J2SE 1.5 using concurrent.&lt;br /&gt;
 */&lt;br /&gt;
public class ProdCons15 {&lt;br /&gt;
  protected boolean done = false;&lt;br /&gt;
  /** Inner class representing the Producer side */&lt;br /&gt;
  class Producer implements Runnable {&lt;br /&gt;
    protected BlockingQueue queue;&lt;br /&gt;
    Producer(BlockingQueue theQueue) { this.queue = theQueue; }&lt;br /&gt;
    public void run() {&lt;br /&gt;
      try {&lt;br /&gt;
        while (true) {&lt;br /&gt;
          Object justProduced = getRequestFromNetwork();&lt;br /&gt;
          queue.put(justProduced);&lt;br /&gt;
          System.out.println(&amp;quot;Produced 1 object; List size now &amp;quot; + queue.size());&lt;br /&gt;
          if (done) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } catch (InterruptedException ex) {&lt;br /&gt;
        System.out.println(&amp;quot;Producer INTERRUPTED&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    Object getRequestFromNetwork() {  // Simulation of reading from client&lt;br /&gt;
      try {&lt;br /&gt;
          Thread.sleep(10); // simulate time passing during read&lt;br /&gt;
      } catch (InterruptedException ex) {&lt;br /&gt;
         System.out.println(&amp;quot;Producer Read INTERRUPTED&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      return(new Object());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /** Inner class representing the Consumer side */&lt;br /&gt;
  class Consumer implements Runnable {&lt;br /&gt;
    protected BlockingQueue queue;&lt;br /&gt;
    Consumer(BlockingQueue theQueue) { this.queue = theQueue; }&lt;br /&gt;
    public void run() {&lt;br /&gt;
      try {&lt;br /&gt;
        while (true) {&lt;br /&gt;
          Object obj = queue.take();&lt;br /&gt;
          int len = queue.size();&lt;br /&gt;
          System.out.println(&amp;quot;List size now &amp;quot; + len);&lt;br /&gt;
          process(obj);&lt;br /&gt;
          if (done) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } catch (InterruptedException ex) {&lt;br /&gt;
          System.out.println(&amp;quot;CONSUMER INTERRUPTED&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    void process(Object obj) {&lt;br /&gt;
      // Thread.sleep(xxx) // Simulate time passing&lt;br /&gt;
      System.out.println(&amp;quot;Consuming object &amp;quot; + obj);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ProdCons15(int nP, int nC) {&lt;br /&gt;
    BlockingQueue myQueue = new LinkedBlockingQueue();&lt;br /&gt;
    for (int i=0; i&amp;lt;nP; i++)&lt;br /&gt;
      new Thread(new Producer(myQueue)).start();&lt;br /&gt;
    for (int i=0; i&amp;lt;nC; i++)&lt;br /&gt;
      new Thread(new Consumer(myQueue)).start();&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args)&lt;br /&gt;
  throws IOException, InterruptedException {&lt;br /&gt;
    // Start producers and consumers&lt;br /&gt;
    int numProducers = 4;&lt;br /&gt;
    int numConsumers = 3;&lt;br /&gt;
    ProdCons15 pc = new ProdCons15(numProducers, numConsumers);&lt;br /&gt;
    // Let the simulation run for, say, 10 seconds&lt;br /&gt;
    Thread.sleep(10*1000); &lt;br /&gt;
    // End of simulation - shut down gracefully&lt;br /&gt;
    pc.done = true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Producer consumer in Java 1 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
/** Producer-Consumer in Java. Version 1.&lt;br /&gt;
 */&lt;br /&gt;
public class ProdCons1 {&lt;br /&gt;
  protected LinkedList list = new LinkedList();&lt;br /&gt;
  protected void produce() {&lt;br /&gt;
    int len = 0;&lt;br /&gt;
    synchronized(list) {&lt;br /&gt;
      Object justProduced = new Object();&lt;br /&gt;
      list.addFirst(justProduced);&lt;br /&gt;
      len = list.size();&lt;br /&gt;
      list.notifyAll();&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;List size now &amp;quot; + len);&lt;br /&gt;
  }&lt;br /&gt;
  protected void consume() {&lt;br /&gt;
    Object obj = null;&lt;br /&gt;
    int len = 0;&lt;br /&gt;
    synchronized(list) {&lt;br /&gt;
      while (list.size() == 0) {&lt;br /&gt;
        try {&lt;br /&gt;
          list.wait();&lt;br /&gt;
        } catch (InterruptedException ex) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      obj = list.removeLast();&lt;br /&gt;
      len = list.size();&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;Consuming object &amp;quot; + obj);&lt;br /&gt;
    System.out.println(&amp;quot;List size now &amp;quot; + len);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) throws IOException {&lt;br /&gt;
    ProdCons1 pc = new ProdCons1();&lt;br /&gt;
    System.out.println(&amp;quot;Ready (p to produce, c to consume):&amp;quot;);&lt;br /&gt;
    int i;&lt;br /&gt;
    while ((i = System.in.read()) != -1) {&lt;br /&gt;
      char ch = (char)i;&lt;br /&gt;
      switch(ch) {&lt;br /&gt;
        case &amp;quot;p&amp;quot;:  pc.produce(); break;&lt;br /&gt;
        case &amp;quot;c&amp;quot;:  pc.consume(); break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Producer consumer in Java 2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
/** Producer-consumer in Java, Take II.&lt;br /&gt;
 */&lt;br /&gt;
public class ProdCons2 {&lt;br /&gt;
  /** Throughout the code, this is the object we synchronize on so this&lt;br /&gt;
   * is also the object we wait() and notifyAll() on.&lt;br /&gt;
   */&lt;br /&gt;
  protected LinkedList list = new LinkedList();&lt;br /&gt;
  protected int MAX = 10;&lt;br /&gt;
  protected boolean done = false; // Also protected by lock on list.&lt;br /&gt;
  /** Inner class representing the Producer side */&lt;br /&gt;
  class Producer extends Thread {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      while (true) {&lt;br /&gt;
        Object justProduced = getRequestFromNetwork();&lt;br /&gt;
        // Get request from the network - outside the synch section.&lt;br /&gt;
        // We&amp;quot;re simulating this actually reading from a client, and it&lt;br /&gt;
        // might have to wait for hours if the client is having coffee.&lt;br /&gt;
        synchronized(list) {&lt;br /&gt;
            while (list.size() == MAX) // queue &amp;quot;full&amp;quot;&lt;br /&gt;
            try {&lt;br /&gt;
              System.out.println(&amp;quot;Producer WAITING&amp;quot;);&lt;br /&gt;
              list.wait();   // Limit the size&lt;br /&gt;
            } catch (InterruptedException ex) {&lt;br /&gt;
              System.out.println(&amp;quot;Producer INTERRUPTED&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
          list.addFirst(justProduced);&lt;br /&gt;
          list.notifyAll();  // must own the lock&lt;br /&gt;
          System.out.println(&amp;quot;Produced 1; List size now &amp;quot; + list.size());&lt;br /&gt;
          if (done)&lt;br /&gt;
            break;&lt;br /&gt;
          // yield();  // Useful for green threads &amp;amp; demo programs.&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    Object getRequestFromNetwork() {  // Simulation of reading from client&lt;br /&gt;
      // try {&lt;br /&gt;
      //   Thread.sleep(10); // simulate time passing during read&lt;br /&gt;
      // } catch (InterruptedException ex) {&lt;br /&gt;
      //   System.out.println(&amp;quot;Producer Read INTERRUPTED&amp;quot;);&lt;br /&gt;
      // }&lt;br /&gt;
      return(new Object());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /** Inner class representing the Consumer side */&lt;br /&gt;
  class Consumer extends Thread {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      while (true) {&lt;br /&gt;
        Object obj = null;&lt;br /&gt;
        synchronized(list) {&lt;br /&gt;
          while (list.size() == 0) {&lt;br /&gt;
            try {&lt;br /&gt;
              System.out.println(&amp;quot;CONSUMER WAITING&amp;quot;);&lt;br /&gt;
              list.wait();  // must own the lock&lt;br /&gt;
            } catch (InterruptedException ex) {&lt;br /&gt;
              System.out.println(&amp;quot;CONSUMER INTERRUPTED&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
          obj = list.removeLast();&lt;br /&gt;
          list.notifyAll();&lt;br /&gt;
          int len = list.size();&lt;br /&gt;
          System.out.println(&amp;quot;List size now &amp;quot; + len);&lt;br /&gt;
          if (done)&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        process(obj);  // Outside synch section (could take time)&lt;br /&gt;
        //yield(); DITTO&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    void process(Object obj) {&lt;br /&gt;
      // Thread.sleep(xxx) // Simulate time passing&lt;br /&gt;
      System.out.println(&amp;quot;Consuming object &amp;quot; + obj);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ProdCons2(int nP, int nC) {&lt;br /&gt;
    for (int i=0; i&amp;lt;nP; i++)&lt;br /&gt;
      new Producer().start();&lt;br /&gt;
    for (int i=0; i&amp;lt;nC; i++)&lt;br /&gt;
      new Consumer().start();&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args)&lt;br /&gt;
  throws IOException, InterruptedException {&lt;br /&gt;
    // Start producers and consumers&lt;br /&gt;
    int numProducers = 4;&lt;br /&gt;
    int numConsumers = 3;&lt;br /&gt;
    ProdCons2 pc = new ProdCons2(numProducers, numConsumers);&lt;br /&gt;
    // Let it run for, say, 10 seconds&lt;br /&gt;
    Thread.sleep(10*1000); &lt;br /&gt;
    // End of simulation - shut down gracefully&lt;br /&gt;
    synchronized(pc.list) {&lt;br /&gt;
      pc.done = true;&lt;br /&gt;
      pc.list.notifyAll();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Producer Consumer Test ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/* From http://java.sun.ru/docs/books/tutorial/index.html */&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions are met:&lt;br /&gt;
 *&lt;br /&gt;
 * -Redistribution of source code must retain the above copyright notice, this&lt;br /&gt;
 *  list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 * -Redistribution in binary form must reproduce the above copyright notice,&lt;br /&gt;
 *  this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
 *  and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * Neither the name of Sun Microsystems, Inc. or the names of contributors may&lt;br /&gt;
 * be used to endorse or promote products derived from this software without&lt;br /&gt;
 * specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * This software is provided &amp;quot;AS IS,&amp;quot; without a warranty of any kind. ALL&lt;br /&gt;
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING&lt;br /&gt;
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. (&amp;quot;SUN&amp;quot;)&lt;br /&gt;
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE&lt;br /&gt;
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS&lt;br /&gt;
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST&lt;br /&gt;
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,&lt;br /&gt;
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY&lt;br /&gt;
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,&lt;br /&gt;
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
 *&lt;br /&gt;
 * You acknowledge that this software is not designed, licensed or intended&lt;br /&gt;
 * for use in the design, construction, operation or maintenance of any&lt;br /&gt;
 * nuclear facility.&lt;br /&gt;
 */&lt;br /&gt;
public class ProducerConsumerTest {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        CubbyHole c = new CubbyHole();&lt;br /&gt;
        Producer p1 = new Producer(c, 1);&lt;br /&gt;
        Consumer c1 = new Consumer(c, 1);&lt;br /&gt;
        p1.start();&lt;br /&gt;
        c1.start();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class CubbyHole {&lt;br /&gt;
    private int contents;&lt;br /&gt;
    private boolean available = false;&lt;br /&gt;
    public synchronized int get() {&lt;br /&gt;
        while (available == false) {&lt;br /&gt;
            try {&lt;br /&gt;
                wait();&lt;br /&gt;
            } catch (InterruptedException e) { }&lt;br /&gt;
        }&lt;br /&gt;
        available = false;&lt;br /&gt;
        notifyAll();&lt;br /&gt;
        return contents;&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void put(int value) {&lt;br /&gt;
        while (available == true) {&lt;br /&gt;
            try {&lt;br /&gt;
                wait();&lt;br /&gt;
            } catch (InterruptedException e) { }&lt;br /&gt;
        }&lt;br /&gt;
        contents = value;&lt;br /&gt;
        available = true;&lt;br /&gt;
        notifyAll();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Consumer extends Thread {&lt;br /&gt;
    private CubbyHole cubbyhole;&lt;br /&gt;
    private int number;&lt;br /&gt;
    public Consumer(CubbyHole c, int number) {&lt;br /&gt;
        cubbyhole = c;&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
    public void run() {&lt;br /&gt;
        int value = 0;&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            value = cubbyhole.get();&lt;br /&gt;
            System.out.println(&amp;quot;Consumer #&amp;quot; + this.number&lt;br /&gt;
                               + &amp;quot; got: &amp;quot; + value);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Producer extends Thread {&lt;br /&gt;
    private CubbyHole cubbyhole;&lt;br /&gt;
    private int number;&lt;br /&gt;
    public Producer(CubbyHole c, int number) {&lt;br /&gt;
        cubbyhole = c;&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
    public void run() {&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            cubbyhole.put(i);&lt;br /&gt;
            System.out.println(&amp;quot;Producer #&amp;quot; + this.number&lt;br /&gt;
                               + &amp;quot; put: &amp;quot; + i);&lt;br /&gt;
            try {&lt;br /&gt;
                sleep((int)(Math.random() * 100));&lt;br /&gt;
            } catch (InterruptedException e) { }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The producer-consumer approach to thread cooperation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// : c13:Restaurant.java&lt;br /&gt;
// The producer-consumer approach to thread cooperation.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
class Order {&lt;br /&gt;
  private static int i = 0;&lt;br /&gt;
  private int count = i++;&lt;br /&gt;
  public Order() {&lt;br /&gt;
    if (count == 10) {&lt;br /&gt;
      System.out.println(&amp;quot;Out of food, closing&amp;quot;);&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return &amp;quot;Order &amp;quot; + count;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class WaitPerson extends Thread {&lt;br /&gt;
  private Restaurant restaurant;&lt;br /&gt;
  public WaitPerson(Restaurant r) {&lt;br /&gt;
    restaurant = r;&lt;br /&gt;
    start();&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
      while (restaurant.order == null)&lt;br /&gt;
        synchronized (this) {&lt;br /&gt;
          try {&lt;br /&gt;
            wait();&lt;br /&gt;
          } catch (InterruptedException e) {&lt;br /&gt;
            throw new RuntimeException(e);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      System.out.println(&amp;quot;Waitperson got &amp;quot; + restaurant.order);&lt;br /&gt;
      restaurant.order = null;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Chef extends Thread {&lt;br /&gt;
  private Restaurant restaurant;&lt;br /&gt;
  private WaitPerson waitPerson;&lt;br /&gt;
  public Chef(Restaurant r, WaitPerson w) {&lt;br /&gt;
    restaurant = r;&lt;br /&gt;
    waitPerson = w;&lt;br /&gt;
    start();&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
      if (restaurant.order == null) {&lt;br /&gt;
        restaurant.order = new Order();&lt;br /&gt;
        System.out.print(&amp;quot;Order up! &amp;quot;);&lt;br /&gt;
        synchronized (waitPerson) {&lt;br /&gt;
          waitPerson.notify();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      try {&lt;br /&gt;
        sleep(100);&lt;br /&gt;
      } catch (InterruptedException e) {&lt;br /&gt;
        throw new RuntimeException(e);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class Restaurant {&lt;br /&gt;
  Order order; // Package access&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Restaurant restaurant = new Restaurant();&lt;br /&gt;
    WaitPerson waitPerson = new WaitPerson(restaurant);&lt;br /&gt;
    Chef chef = new Chef(restaurant, waitPerson);&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>