欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 生產(chǎn)者/消費(fèi)者問(wèn)題實(shí)例詳解

 更新時(shí)間:2017年04月18日 11:20:24   投稿:wbb  
這篇文章主要實(shí)例分析了java中生產(chǎn)者消費(fèi)者問(wèn)題的方法,需要的朋友可以可以參考下

生產(chǎn)者和消費(fèi)者問(wèn)題是線(xiàn)程模型中的經(jīng)典問(wèn)題:生產(chǎn)者和消費(fèi)者在同一時(shí)間段內(nèi)共用同一個(gè)存儲(chǔ)空間,如下圖所示,生產(chǎn)者向空間里存放數(shù)據(jù),而消費(fèi)者取用數(shù)據(jù),如果不加以協(xié)調(diào)可能會(huì)出現(xiàn)以下情況:

存儲(chǔ)空間已滿(mǎn),而生產(chǎn)者占用著它,消費(fèi)者等著生產(chǎn)者讓出空間從而去除產(chǎn)品,生產(chǎn)者等著消費(fèi)者消費(fèi)產(chǎn)品,從而向空間中添加產(chǎn)品?;ハ嗟却?,從而發(fā)生死鎖。


以下實(shí)例演示了如何通過(guò)線(xiàn)程解決生產(chǎn)者/消費(fèi)者問(wèn)題:

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

以上代碼運(yùn)行輸出結(jié)果為:

消費(fèi)者 #1 got: 0
生產(chǎn)者 #1 put: 0
生產(chǎn)者 #1 put: 1
消費(fèi)者 #1 got: 1
生產(chǎn)者 #1 put: 2
消費(fèi)者 #1 got: 2
生產(chǎn)者 #1 put: 3
消費(fèi)者 #1 got: 3
生產(chǎn)者 #1 put: 4
消費(fèi)者 #1 got: 4
生產(chǎn)者 #1 put: 5
消費(fèi)者 #1 got: 5
生產(chǎn)者 #1 put: 6
消費(fèi)者 #1 got: 6
生產(chǎn)者 #1 put: 7
消費(fèi)者 #1 got: 7
生產(chǎn)者 #1 put: 8
消費(fèi)者 #1 got: 8
生產(chǎn)者 #1 put: 9
消費(fèi)者 #1 got: 9

希望本篇文章對(duì)您有所幫助

相關(guān)文章

最新評(píng)論