java多執行緒總結六:經典生產者消費者問題實現
這是個執行緒同步的經典例子,原始碼如下:
package demo.thread;
/**
*經典生產者與消費者問題:生產者不斷的往倉庫中存放產品,消費者從倉庫中消費產品。
*其中生產者和消費者都可以有若干個。倉庫容量有限,庫滿時不能存放,庫空時不能取產品
*/
public class ProducersAndConsumers {
public static void main(String[] args) {
Storage storage = new Storage();
Thread consumer = new Thread(new Consumer(storage));
consumer.setName("消費者");
Thread producer = new Thread(new Producer(storage));
producer.setName("生產者");
consumer.start();
producer.start();
}
}
/**
* 消費者
*/
class Consumer implements Runnable {
private Storage storage;
public Consumer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
storage.pop();
}
}
/**
* 生產者
*/
class Producer implements Runnable {
private Storage storage;
public Producer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
Product product = new Product("090505105", "電話");
storage.push(product);
}
}
/**
* 產品類
*/
class Product {
private String id;// 產品id
private String name;// 產品名稱
public Product(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "(產品ID:" + id + " 產品名稱:" + name + ")";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
*倉庫
*/
class Storage {
// 倉庫容量為10
private Product[] products = new Product[10];
private int top = 0;
// 生產者往倉庫中放入產品
public synchronized void push(Product product) {
while (top == products.length) {
try {
wait();//倉庫已滿,等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//把產品放入倉庫
products[top++] = product;
System.out.println(Thread.currentThread().getName() + " 生產了產品"
+ product);
notifyAll();//喚醒等待執行緒
}
// 消費者從倉庫中取出產品
public synchronized Product pop() {
while (top == 0) {
try {
wait();//倉庫空,等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//從倉庫中取產品
--top;
Product p = new Product(products[top].getId(), products[top].getName());
products[top] = null;
System.out.println(Thread.currentThread().getName() + " 消費了產品" + p);
notifyAll();//喚醒等待執行緒
return p;
}
}
執行結果:
生產者 生產了產品(產品ID:090505105 產品名稱:電話)
消費者 消費了產品(產品ID:090505105 產品名稱:電話)
相關文章
- 關於Java多執行緒實現生產者和消費者的問題Java執行緒
- Java多執行緒——生產者消費者示例Java執行緒
- python中多執行緒消費者生產者問題Python執行緒
- 多執行緒-生產者消費者問題程式碼1執行緒
- Java多執行緒——生產者和消費者模式Java執行緒模式
- Java多執行緒14:生產者/消費者模型Java執行緒模型
- 多執行緒之生產者消費者執行緒
- java實現生產者消費者問題Java
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- 多執行緒併發如何高效實現生產者/消費者?執行緒
- 用Python多執行緒實現生產者消費者模式Python執行緒模式
- python 多執行緒實現生產者與消費者模型Python執行緒模型
- Java 多執行緒基礎(十二)生產者與消費者Java執行緒
- Java多執行緒——消費者與生產者的關係Java執行緒
- JAVA執行緒消費者與生產者模型Java執行緒模型
- Java 多執行緒學習(執行緒通訊——消費者和生產者)Java執行緒
- 多執行緒-生產者消費者問題程式碼2並解決執行緒安全問題執行緒
- Java多執行緒程式設計(同步、死鎖、生產消費者問題)Java執行緒程式設計
- Java 多執行緒(Java.Thread)------ 執行緒協作(生產者消費者模式)Java執行緒thread模式
- Java多執行緒-併發協作(生產者消費者模型)Java執行緒模型
- Thinking in Java---執行緒通訊+三種方式實現生產者消費者問題ThinkingJava執行緒
- java學習回顧---生產者與消費者問題以及多執行緒補充Java執行緒
- 使用Python佇列和多執行緒實現生產者消費者Python佇列執行緒
- 生產者消費者模式--java多執行緒同步方法的應用模式Java執行緒
- Python-多執行緒及生產者與消費者Python執行緒
- 多執行緒下的生產者和消費者-BlockingQueue執行緒BloC
- Java多執行緒15:Queue、BlockingQueue以及利用BlockingQueue實現生產者/消費者模型Java執行緒BloC模型
- Java實現生產者和消費者Java
- Java實現生產者-消費者模型Java模型
- python多執行緒+生產者和消費者模型+queue使用Python執行緒模型
- C#多執行緒學習(三) 生產者和消費者C#執行緒
- 多執行緒-生產者消費者之等待喚醒機制執行緒
- C# 多執行緒學習(3) :生產者和消費者C#執行緒
- Java多執行緒之併發協作生產者消費者設計模式Java執行緒設計模式
- 多執行緒 -- 移動檔案(生產者,消費者模式應用)執行緒模式
- Python並行程式設計(六):多執行緒同步之queue(佇列)實現生產者-消費者模型Python並行行程程式設計執行緒佇列模型
- java 執行緒池、多執行緒併發實戰(生產者消費者模型 1 vs 10) 附案例原始碼Java執行緒模型原始碼
- java多執行緒之消費生產模型Java執行緒模型