多线程——生产者消费者问题-----管程法
Posted 做个机灵鬼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程——生产者消费者问题-----管程法相关的知识,希望对你有一定的参考价值。
理论整理
问题描述:
这是一个线程同步问题,生产者和消费者共享一个资源,并且生产者和消费者之间相互依赖,相为条件
1.生产者在没有生产产品之前要通知消费者等待,而在生产之后又要通知消费者消费
2.对于消费者,消费者结束消费之后,要通知生产者生产新的产品以供消费
3.生产者消费者问题,仅有synchronized是不够的
synchronize可阻止并发更新同一个资源,实现了同步
synchronize实现不了不同线程之间的消息联系(通信)
解决思路:
设计模式:
代码实现:
//生产者消费者模型,利用缓冲区解决:管程法
//生产者 消费者 产品 缓冲区
public class TextPc {
public static void main(String[] args) {
SynContainer synContainer = new SynContainer();
new Producer(synContainer).start();
new Consumer(synContainer).start();
}
}
//生产者
class Producer extends Thread{
SynContainer synContainer;
public Producer(SynContainer synContainer){
this.synContainer = synContainer;
}
//生产100只鸡
@Override
public void run() {
for (int i = 1; i < 100; i++) {
synContainer.push(new Chichen(i));
System.out.println("生产了第"+i+"只鸡");
}
}
}
//消费者
class Consumer extends Thread{
SynContainer synContainer;
public Consumer(SynContainer synContainer){
this.synContainer = synContainer;
}
@Override
public void run() {
for (int i = 1; i < 100; i++) {
System.out.println("消费了第"+synContainer.pop().id+"只鸡");
}
}
}
//产品
class Chichen{
int id;
public Chichen(int id) {
this.id = id;
}
}
//缓冲区
class SynContainer{
//设置一个容器
Chichen[] chichens = new Chichen[10];//同时可以存放10只鸡
//设置一个计数器
int count = 0;
//生产者放入方法
//这里传入的是Chichen类型的参数,不能直接写chichens
//chichens是定义的一个具体对象
public synchronized void push(Chichen chichen){
//判断容器是否满了,如果满了等待消费者取走
//this.wait()和this.notifyAll()必须在同步方法或者同步代码块中使用
if(count==chichens.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//生产者等待,通知消费者消费
}
//如果容器未满,需要丢入产品
chichens[count] = chichen;
count++;
//可以通知消费者消费者了
this.notifyAll();
}
//消费者消费方法
public synchronized Chichen pop(){
if(count==0){
//消费者等待 ,通知生产者生产
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//打印出具体哪个id的鸡
count--;
Chichen chichen = chichens[count];
//吃完 通知生产者生产
//唤醒生产者中的wait()
this.notifyAll();
return chichen;
}
}
以上是关于多线程——生产者消费者问题-----管程法的主要内容,如果未能解决你的问题,请参考以下文章