描述消费者和生产者模式的代码(有些公司面试的时候会让你直接写一段代码)

本文通过一个具体的Java程序实现,展示了生产者消费者模式的工作原理。该程序使用了同步栈来模拟生产者(制作窝头)与消费者(消费窝头)之间的交互过程,有效地解决了资源竞争的问题,并展示了如何在多线程环境中正确地使用wait()和notify()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package thread;

/**
 * 生产者消费者模式
 * @author 编程只服JAVA
 *
 */
public class ProducerConsumer {
	public static void main(String[] args) {
		SyncStack ss=new SyncStack();
		Producer producer=new Producer(ss);
		Consumer consumer=new Consumer(ss);
		Thread t1=new Thread(producer);
		Thread t2=new Thread(consumer);
		t1.start();
		t2.start();
	}
}
/**
 * 窝头类:一个篮子里面的馒头
 */
class WoTou{
	int id;//给每一个窝头标记一个id
	WoTou(int id){
		this.id=id;
	}
	public String toString(){
		return "WoTou:"+id;
	}
}
/**
 * 利用栈来模拟存放窝头的篮子
 */
class SyncStack{
	int index=0;
	WoTou[] arrWT=new WoTou[6];//可以装6个窝头
	
	//放窝头:锁住该方法,防止多线程访问,造成前后结果不一致
	public synchronized void push(WoTou wt){
		if (index==arrWT.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		this.notify();//如果有多个线程 改为notifyAll即可
		arrWT[index]=wt;//放入一个窝头
		index++;//标记++,以便下次存放窝头
	}
	//取窝头:锁住该方法,防止多线程访问,造成前后结果不一致
	public synchronized WoTou pop(){
		if (index==0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		this.notify();
		index--;
		return arrWT[index];
	}
}
/**
 * 生产者:相当一个线程,继承Runnable接口
 */
class Producer implements Runnable{
	SyncStack ss=null;
	public Producer(SyncStack ss) {
		this.ss=ss;
	}
	
	public void run() {
		for(int i=1;i<=20;i++){
			WoTou wt=new WoTou(i);
			ss.push(wt);
			System.out.println("生产了:"+wt);
			try {
				Thread.sleep((int)Math.random()*1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}
class Consumer implements Runnable{
	SyncStack ss=null;
	public Consumer(SyncStack ss) {
		this.ss=ss;
	}
	
	public void run() {
		for(int i=1;i<=20;i++){
			WoTou wt=ss.pop();
			System.out.println("消费了:"+wt);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值