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

溫馨提示×

溫馨提示×

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

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

Java通過線程如何解決生產者/消費者問題

發布時間:2020-10-28 19:04:58 來源:億速云 閱讀:167 作者:Leah 欄目:開發技術

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通過線程如何解決生產者/消費者問題的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

洮南市| 颍上县| 江阴市| 利辛县| 宁强县| 玉树县| 吴川市| 乌恰县| 毕节市| 长治市| 台东市| 大足县| 黄山市| 高雄市| 宁武县| 金门县| 津市市| 石河子市| 武宁县| 衡水市| 嘉祥县| 五台县| 吉安县| 翁源县| 湟中县| 丰镇市| 岱山县| 东阿县| 龙海市| 昌邑市| 河源市| 汤原县| 兴城市| 吉木萨尔县| 灌云县| 辉南县| 芦山县| 逊克县| 南漳县| 阿坝| 龙游县|