1. 程式人生 > 程式設計 >Java如何通過執行緒解決生產者/消費者問題

Java如何通過執行緒解決生產者/消費者問題

生產者和消費者問題是執行緒模型中的經典問題:生產者和消費者在同一時間段內共用同一個儲存空間,如下圖所示

Java如何通過執行緒解決生產者/消費者問題

生產者向空間裡存放資料,而消費者取用資料,如果不加以協調可能會出現以下情況:

儲存空間已滿,而生產者佔用著它,消費者等著生產者讓出空間從而去除產品,生產者等著消費者消費產品,從而向空間中新增產品。互相等待,從而發生死鎖。

以下例項演示瞭如何通過執行緒解決生產者/消費者問題:

/*
 author by javaidea.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("消費者 #" + 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("生產者 #" + this.number + " put: " + i);
     try {
      sleep((int)(Math.random() * 100));
     } catch (InterruptedException e) { }
   }
  }
}

以上程式碼執行輸出結果為:

消費者 #1 got: 0
生產者 #1 put: 0
生產者 #1 put: 1
消費者 #1 got: 1
生產者 #1 put: 2
消費者 #1 got: 2
生產者 #1 put: 3
消費者 #1 got: 3
生產者 #1 put: 4
消費者 #1 got: 4
生產者 #1 put: 5
消費者 #1 got: 5
生產者 #1 put: 6
消費者 #1 got: 6
生產者 #1 put: 7
消費者 #1 got: 7
生產者 #1 put: 8
消費者 #1 got: 8
生產者 #1 put: 9
消費者 #1 got: 9

以上就是Java如何通過執行緒解決生產者/消費者問題的詳細內容,更多關於Java 解決生產者/消費者問題的資料請關注我們其它相關文章!