生产者和消费者

本文通过实现一个简单的多线程程序,详细解释了生产者消费者问题,其中包括店员(缓冲区)如何管理有限数量的产品,确保生产者不超载,消费者不抢购。程序通过同步机制保证了线程间的正确交互。

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();

}

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值