package com.yuxinyicheng.test2;
/*
*生产者和消费者的问题:
*生产者将产品交给店员,而消费者从店员处取走产品,
*店员一次只能有固定数量的产品(比如:20个)
*如果生产者试图生产更多的产品,店员会叫生产者停一下,
*如果店员中有空位放产品,再通知生产者继续生产;
*如果店中没有产品,店员会告诉消费者等一下,
*如果店中有产品再通知消费者取走产品。
*
*
* */
class Clerk{//店
int product;//产品数量
//生产产品
public synchronized void addProduct(){
while(true){
if(product>=20){
try {
wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else{
product++;
System.out.println(Thread.currentThread().getName()+"生产了"+product+"个产品");
notifyAll();
}
}
}
public synchronized void consumeProduct(){
while(true){
if(product<=0){
try {
wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else{
System.out.println(Thread.currentThread().getName()+"消费了"+product+"个产品");
product--;
notifyAll();
}
}
}
}
class Productor implements Runnable{//生产者
Clerk clerk ;
public Productor(Clerk clerk ){
this.clerk=clerk;
}
@Override
public void run() {
clerk.addProduct();
}
}
class Consumer implements Runnable{
Clerk clerk ;
public Consumer(Clerk clerk ){
this.clerk=clerk;
}
@Override
public void run() {
clerk.consumeProduct();
}
}
public class TestProduceConsume {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Clerk clerk = new Clerk();
Productor productor=new Productor(clerk);
Consumer consumer=new Consumer(clerk);
Thread t1=new Thread(productor);
Thread t2=new Thread(consumer);
t1.setName("生产者");
t2.setName("消费者");
t1.start();
t2.start();
}
}
本文通过实现一个简单的多线程程序,详细解释了生产者消费者问题,其中包括店员(缓冲区)如何管理有限数量的产品,确保生产者不超载,消费者不抢购。程序通过同步机制保证了线程间的正确交互。

被折叠的 条评论
为什么被折叠?



