生产者与消费者模式之烧饼店铺

通过一个生动的故事介绍了生产者与消费者模式,讲述了烧饼铺老板不断制作烧饼,而三个饥饿的顾客不停消费烧饼的过程。

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

       生产者与消费者模式是Java线程同步问题中的一个非常经典的例子,以一个故事开始:

       话说,在江南的一个小镇上,有一个烧饼铺,这儿的老板人做烧饼堪称一绝,非常好吃,
最重要的是他人不仅长得帅,而且善良大方,镇上的人都喜欢来店铺吃烧饼,烧饼铺美名满天下。
       这天风和日丽,鸟语花香,一切都是那么美好。突然,来个三个人,第一个叫属驴,第二个叫田小四,第三个老羊。
属驴这人,黑如李逵,瘦如妖猴,但是肚子出奇的大,一看就是能吃的人,但是为啥瘦如妖猴就不得而知了...
田小四这儿看起来肥头大耳,长了一个猪鼻子,嘴巴出奇的大,吃东西肯定相当快...

老羊这人身穿一件黄大袍,手提琅琊榜,牙齿长的厉害,能碰到下巴...

看的出来他们都非常能吃,并且好像已经很久没有吃饭了。这下可把烧饼铺的老板爱心斯坦 忙坏了... ...

  • 生产者:Producer.java
import java.util.List;
/**
 * 生产者
 * @author GengYB
 *
 */
public class Producer extends Thread {
	private List<Object> continer; //装烧饼的篮子
	
	public Producer(List<Object> con) {
		super();
		this.continer = con;
	}
	
	@Override
	public void run() {
		super.run();
		int i = 1;
		//循环生产烧饼
		while(true) {
			String s1 = new String("烧饼"+(i++));
			continer.add(s1);
			synchronized (continer) {
				System.out.println(Thread.currentThread().getName()+"说:一个烧饼出炉了~");
				continer.notify();//发出通知
			}
			try {
				Thread.sleep(1000); //一秒生产一个烧饼
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
  • 消费者:Customer.java
import java.util.List;
/**
 * 
 * @author GengYB
 * 消费者
 *
 */
public class Customer extends Thread {
	private List<Object> container; //装烧饼的篮子

	public Customer(List<Object> con) {
		super();
		this.container = con;
	}

	@Override
	public void run() {
		super.run();
		while (true) {
			synchronized (container) {
				if (container.size() == 0) {
					System.out.println(Thread.currentThread().getName() + "说:快点,饿死了!");
					try {
						container.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					Object remove = container.remove(0);
					System.out.println(Thread.currentThread().getName() + "吃掉出炉的" + remove);
				}
			}
		}
	}
}
  • 测试代码:Main.java
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Scanner;
/**
 * 烧饼店铺(test)
 * @author Administrator
 *
 */
public class Main {
	public static void main(String[] args) throws IOException {
		getStory();
		LinkedList<Object> container = new LinkedList<Object>();//装烧饼的篮子
		Customer c1 = new Customer(container); //吃烧饼的胖子
		c1.setName("属驴");
		Customer c2 = new Customer(container);
		c2.setName("田小四");
		Customer c3 = new Customer(container);
		c3.setName("老羊");
		c1.start();
		c2.start();
		c3.start();
		
		
		Producer producer = new Producer(container);
		producer.setName("烧饼铺,爱心斯坦");
		producer.start(); //开始做烧饼
	}
	
	private static void getStory() throws IOException {
		FileInputStream fis = new FileInputStream("./story.dat");
		InputStreamReader isr = new InputStreamReader(fis,"utf-8");
		BufferedReader br = new BufferedReader(isr);
		
		String line;
		while((line = br.readLine())!=null) {
			System.out.println(line);
			try {     
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		br.close();
		System.out.println("按Enter继续....");
		Scanner in = new Scanner(System.in);
		String nextLine = in.nextLine();
		System.out.println(nextLine);
		in.close();
	}
}
  • 故事剧情:./story.dat
 话说,在江南的一个小镇上,有一个烧饼铺,这儿的老板人做烧饼堪称一绝,非常好吃,
最重要的是他人不仅长得帅,而且善良大方,镇上的人都喜欢来店铺吃烧饼,烧饼铺美名满天下。
   这天风和日丽,鸟语花香,一切都是那么美好。突然,来个三个人,第一个叫属驴,第二个叫田小四,第三个老羊。
属驴这人,黑如李逵,瘦如妖猴,但是肚子出奇的大,一看就是能吃的人,但是为啥瘦如妖猴就不得而知了...
田小四这儿看起来肥头大耳,长了一个猪鼻子,嘴巴出奇的大,吃东西肯定相当快...
老羊这人身穿一件黄大袍,手提琅琊榜,牙齿长的厉害,能碰到下巴...
看的出来他们都非常能吃,并且好像已经很久没有吃饭了。这下可把烧饼铺的老板爱心斯坦 忙坏了... ...
............


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloud-Future

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值