生產者消費者模式見上圖所示。
blog宗旨:用圖說話。
代碼示例:
package com.huan;
public class ProduceConsumer {
public static void main(String[] args) {
Middleware middleware = new Middleware();
new Thread(new Producer(middleware)).start();
new Thread(new Consumer(middleware)).start();
}
}
class Producer implements Runnable{
private Middleware middleware;
public Producer(Middleware middleware){
this.middleware = middleware;
}
public void produce() throws Exception{
while(true){
middleware.put();
}
}
@Override
public void run() {
try {
produce();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private Middleware middleware;
public Consumer(Middleware middleware){
this.middleware = middleware;
}
public void consume() throws Exception{
while(true){
middleware.get();
}
}
@Override
public void run() {
try {
consume();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Middleware{
private static final int MAX_SIZE = 10;
private int[] storage = new int[MAX_SIZE];
private int index = 0;
public synchronized void put() throws Exception{
if(index == MAX_SIZE){
wait();
}
storage[index] = index;
System.out.println("生產了:" + index);
index++;
notify();
}
public synchronized void get() throws Exception{
if(index == 0){
wait();
}
index--;
System.out.println("消費了:" + storage[index]);
notify();
}
}
代碼缺陷:當多個消費者時,或者多個生產者時,上例代碼需要完善。