什么是生產者-消費者模式
比如有兩個進程A和B,它們共享一個固定大小的緩沖區,A進程產生數據放入緩沖區,B進程從緩沖區中取出數據進行計算,那么這里其實就是一個生產者和消費者的模式,A相當於生產者,B相當於消費者,生產者消費者要解決的問題就是如何處理公共資源。
生產者-消費者模式的特點
- 保證生產者不會在緩沖區滿的時候繼續向緩沖區放入數據,而消費者也不會在緩沖區空的時候,消耗數據
- 當緩沖區滿的時候,生產者會進入休眠狀態,當下次消費者開始消耗緩沖區的數據時,生產者才會被喚醒,開始往緩沖區中添加數據;當緩沖區空的時候,消費者也會進入休眠狀態,直到生產者往緩沖區中添加數據時才會被喚醒
代碼實現package com.rao.operatingSystem
public class ProducerAndConsumer {
public static void main(String[] args) {
Factory factory = new Factory(10);
Producer producer = new Producer(factory);
Producer producer2 = new Producer(factory);
Consumer consumer = new Consumer(factory);
producer.start();
producer2.start();
consumer.start();
}
/**
* 工廠模型,表示公共資源
*/
static class Factory{
int max;//工廠的最大物品數
int num;//當前工廠當中還有多少物品
public Factory(int max) {
this.max = max;
}
/**
* 生產
*/
synchronized void add(){
//如果工廠沒有滿,就生產物品
if (num < max){
num++;
System.out.println("生產了一件商品,現在工廠中還有:" + num + "件物品");
//喚醒等待的消費者來消費
notifyAll();
}else {
try {
//工廠滿了,生產者等待
System.out.println("工廠滿了,生產者等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized void remove(){
//如果工廠有物品
if (0 < num){
num--;
System.out.println("消費了一件物品,還剩下:" + num + "件物品");
//喚醒等待的生產者來生產物品
notifyAll();
}else {
try {
//沒有東西可以被消費了,該線程等待,等到生產者來生產
System.out.println("工廠沒東西了,消費者等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 生產者
*/
static class Producer extends Thread{
Factory factory;
public Producer(Factory factory) {
this.factory = factory;
}
@Override
public void run() {
while (true){
//一直生產
try{
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
factory.add();
}
}
}
/**
* 消費者
*/
static class Consumer extends Thread{
Factory factory;
public Consumer(Factory factory) {
this.factory = factory;
}
@Override
public void run() {
while (true){
//一直消費
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
factory.remove();
}
}
}
}