生产者与消费者模式案例

#粤嵌星计划,粤嵌我来了#

#粤嵌星计划,粤嵌我来了#

核心思想:

(1)生产者是一个线程--生产者负责生产商品。

(2)消费者是另外一线程---负责消费商品。

(3)不能生产过剩,也就是生产者生产一个商品,消费者消费一个。

思路:严格遵循生产者生产一个商品,消费者消费一个。

也就是当生产者生产一个商品后,则将自己等待(调用wait()函数),等待的同时需要唤醒消费者(调用notify()函数),完成消费,消费者完成消费后,需要等待,同时需要通知生产者生产商品。


案例:

Info类(模拟生产消费过程):

public class Info {
	private String name = "生产者:"; // 信息名称,指定默认值
	private String content = "我生产OK"; // 信息内容,指定默认值
	private boolean flag = false; // 设置标志位
	public String getName() { // 取得信息名称
		return name; // 返回信息名称
	}
	public void setName(String name) { // 设置信息名称
		this.name = name; // 设置name属性内容
	}
	public String getContent() { // 取得信息内容
		return content; // 返回信息内容
	}
	public void setContent(String content) { // 设置信息内容
		this.content = content; // 设置content属性内容
	}
	public synchronized void set(String name, String content) { // 设置信息名称及内容
		try {
			if (!flag) { // 标志位为false,不可以生产
				this.wait(); // 等待消费者取走,处理异常
			}
			this.setName(name); // 设置信息名称
			this.setContent(content); // 设置信息内容
			flag = false; // 修改标志位,表示可以取走
			this.notify();
		} catch (Exception e) {
			// TODO: handle exception
		} // 唤醒等待线程
	}
	public synchronized void get() { // 取得信息内容
		try {
			if (flag) { // 标志位为true,不可以取走
				this.wait(); // 等待生产者生产,处理异常
			}
			Thread.sleep(600); // 加入延迟,处理异常
			System.out.println(this.getName() + " --> " + this.getContent()); // 输出信息
			flag = true; // 修改标志位为true,表示可以生产
			this.notify(); // 唤醒等待线程
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

Producer生产者类:

public class Producer implements Runnable {
	private Info info = null; // 保存Info引用

	public Producer(Info info) { // 通过构造方法设置Info属性内容
		this.info = info; // 为info属性初始化
	}

	public void run() { // 覆写run()方法
		boolean flag = false; // 定义标记位
		while(true){
			if (flag) { // 如果为true,则设置第一个信息
				this.info.set("生产者:", "我生产OK"); // 设置信息
				flag = false; // 修改标记位
			} else { // 如果为false,则设置第二个信息
				this.info.set("消费者:", "我消费完成"); // 设置信息
				flag = true; // 修改标记位
			}
		}
	}

}

Consumer消费者类:

public class Consumer implements Runnable {
	private Info info = null; 			// 保存Info引用
	public Consumer(Info info) {			// 通过构造方法设置Info属性内容
		this.info = info;				// 为info属性初始化
	}
	public void run() {				// 覆写run()方法
		while(true){
			try {
				Thread.sleep(100); 	// 加入延迟
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			this.info.get(); 			// 取出信息
		}
	}
}

Demo测试类:

public class Demo {
	public static void main(String[] args) {
		Info i = new Info(); // 实例化Info对象
		Producer pro = new Producer(i); // 实例化生产者,传递Info引用
		Consumer con = new Consumer(i); // 实例化消费者,传递Info引用

		new Thread(con).start(); // 启动消费者线程
		new Thread(pro).start(); // 启动生产者线程

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值