中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 生產者/消費者問題實例詳解

發布時間:2020-08-20 23:41:55 來源:腳本之家 閱讀:130 作者:wbb 欄目:編程語言

生產者和消費者問題是線程模型中的經典問題:生產者和消費者在同一時間段內共用同一個存儲空間,如下圖所示,生產者向空間里存放數據,而消費者取用數據,如果不加以協調可能會出現以下情況:

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

Java 生產者/消費者問題實例詳解

以下實例演示了如何通過線程解決生產者/消費者問題:

/*
 author by w3cschool.cc
 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

希望本篇文章對您有所幫助

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

综艺| 朔州市| 丰顺县| 福安市| 宜都市| 南阳市| 报价| 塘沽区| 岚皋县| 鄂托克旗| 鄂温| 铁岭市| 抚州市| 宁陕县| 绥芬河市| 来凤县| 喜德县| 延长县| 喀喇沁旗| 射阳县| 平阳县| 广丰县| 东山县| 南召县| 东阿县| 铜陵市| 永和县| 大石桥市| 宣武区| 越西县| 铜山县| 抚顺市| 仲巴县| 北流市| 南汇区| 玉树县| 青岛市| 石屏县| 颍上县| 德江县| 盐山县|