11.56. Java instance-producer / Consumer issue

发布时间 : 2025-10-25 13:33:11 UTC      

Page Views: 9 views

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:

11.56.1. 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
《地理信息系统原理、技术与方法》  97

最近几年来,地理信息系统无论是在理论上还是应用上都处在一个飞速发展的阶段。 GIS被应用于多个领域的建模和决策支持,如城市管理、区划、环境整治等等,地理信息成为信息时代重要的组成部分之一; “数字地球”概念的提出,更进一步推动了作为其技术支撑的GIS的发展。 与此同时,一些学者致力于相关的理论研究,如空间感知、空间数据误差、空间关系的形式化等等。 这恰好说明了地理信息系统作为应用技术和学科的两个方面,并且这两个方面构成了相互促进的发展过程。