java多线程生产者消费者模型
利用缓冲区解决:管理法
代码
// 生产者,消费者,产品,缓冲区
public class TestPCDemo {
public static void main(String[] args) {
// 定义容器
SynContainer synContainer = new SynContainer();
// 生产者线程
Thread pThread = new Thread(new Producer(synContainer));
// 消费者线程
Thread cThread = new Thread(new Consumer(synContainer));
// 开启线程
pThread.start();
cThread.start();
}
}
// 生产者
class Producer implements Runnable {
// 容器
SynContainer container;
// 构造器
public Producer(SynContainer container) {
this.container = container;
}
// 生产方法
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("生产了第" + i + "个产品");
container.addProduction(new Production(i));
}
}
}
// 消费者
class Consumer implements Runnable {
// 容器
SynContainer container;
// 构造器
public Consumer(SynContainer container) {
this.container = container;
}
// 消费方法
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消费了第" + container.popProduction().id + "个产品");
}
}
}
// 产品
class Production {
// 编号
public int id;
public Production(int id) {
this.id = id;
}
}
// 缓冲区
class SynContainer {
// 需要一个容器大小
Production[] productions = new Production[10];
// 容器计数器
int count = 0;
// 生产者放入产品
public synchronized void addProduction(Production p) {
// 如果容器满了,需要等待消费者消费
if (count == productions.length) {
// 通知消费者,生产等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果没满就生产
productions[count] = p;
++count;
// 有产品就可以通知消费者消费了
this.notifyAll();
}
// 消费者消费产品
public synchronized Production popProduction() {
// 如果容器没有,需要等待生产者生产
if (count == 0) {
// 通知生产者,消费等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果有就消费
--count;
Production production = productions[count];
// 通知生产
this.notifyAll();
// 看看消费的是什么
return production;
}
}