Java instance-producer / Consumer issue


Release date:2024-02-22 Update date:2024-02-24 Editor:admin View counts:131

Label:

Java instance-producer / Consumer issue

The producer and consumer problem is a classic problem in the threading model: producers and consumers share the same storage space at the same time. As shown in the following figure, producers store data in the space, while consumers access data. If it is not coordinated, the following may occur:

The storage space is full, and the producer occupies it, the consumer waits for the producer to make room to remove the product, and the producer waits for the consumer to consume the product, thus adding the product to the space. Wait for each other, resulting in a deadlock.

Image0

The following example demonstrates how to solve producer / consumer problems through threads:

Example

/\*
 author by runoob.com
 ProducerConsumerTest.java
 */
public class ProducerConsumerTest {
   public static void main(String[] args) {
      CubbyHole c = new CubbyHole();
      Producer p1 = new Producer(c, 1);
      Consumer c1 = new Consumer(c, 1);
      p1.start();
      c1.start();
   }
}
class CubbyHole {
   private int contents;
   private boolean available = false;
   public synchronized int get() {
      while (available == false) {
         try {
            wait();
         }
         catch (InterruptedException e) {
         }
      }
      available = false;
      notifyAll();
      return contents;
   }
   public synchronized void put(int value) {
      while (available == true) {
         try {
            wait();
         }
         catch (InterruptedException e) {
         }
      }
      contents = value;
      available = true;
      notifyAll();
   }
}
class Consumer extends Thread {
   private CubbyHole cubbyhole;
   private int number;
   public Consumer(CubbyHole c, int number) {
      cubbyhole = c;
      this.number = number;
   }
   public void run() {
      int value = 0;
         for (int i = 0; i < 10; i++) {
            value = cubbyhole.get();
            System.out.println("consumer #" + this.number+ " got: " +
value);
         }
    }
}
class Producer extends Thread {
   private CubbyHole cubbyhole;
   private int number;
   public Producer(CubbyHole c, int number) {
      cubbyhole = c;
      this.number = number;
   }
   public void run() {
      for (int i = 0; i < 10; i++) {
         cubbyhole.put(i);
         System.out.println("producer #" + this.number + " put: " + i);
         try {
            sleep((int)(Math.random() \* 100));
         } catch (InterruptedException e) { }
      }
   }
}

The output of the above code is as follows:

Consumer #1 got: 0
Producer #1 put: 0
Consumer #1 put: 1
Producer #1 got: 1
Consumer #1 put: 2
Producer #1 got: 2
Consumer #1 put: 3
Producer #1 got: 3
Consumer #1 put: 4
Producer #1 got: 4
Consumer #1 put: 5
Producer #1 got: 5
Consumer #1 put: 6
Producer #1 got: 6
Consumer #1 put: 7
Producer #1 got: 7
Consumer #1 put: 8
Producer #1 got: 8
Consumer #1 put: 9
Producer #1 got: 9

Powered by TorCMS (https://github.com/bukun/TorCMS).