`
cyxlgzs
  • 浏览: 90298 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java实践之路——多线程之生产者消费者模型

阅读更多

一、环境

1、平台:MyEclipse8.5/JDK1.5

二、概述

1、目标:用java实现生产者消费者模型

2、生产者消费者模型描述

1)、生产者仅仅在仓储未满时候生产,仓满则停止生产。

2)、消费者仅仅在仓储有产品时候才能消费,仓空则等待。

3)、当消费者发现仓储没产品可消费时候会通知生产者生产。

4)、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。

三、开发调试

1、编写仓库代码,具体代码如下

package org.cyxl.thread;

/**
 * 仓库
 * @author cyxl
 *
 */
public class Godown {
	private int max_size=100;	//最大库存量
	private int curr_size=0;	//当前库存量
	
	public Godown()
	{}
	
	public Godown(int max_size)
	{
		this.max_size=max_size;
	}
	
	
	public int getMax_size() {
		return max_size;
	}

	public void setMax_size(int maxSize) {
		max_size = maxSize;
	}

	public int getCurr_size() {
		
		return curr_size;
	}
	public  void setCurr_size(int currSize) {
		curr_size = currSize;
	}
	
	/**
	 * 生产时增加库存量,注意同步
	 * @param size	生产数量
	 */
	public synchronized void add(int size)
	{
		while((this.curr_size+size)>this.max_size)
		{
			System.out.println("生产"+size+"后"+(this.curr_size+size)+"超过了仓库的最大库存量"+this.max_size+",所以不生产");
			try {
				//仓满停止生产,直到可以生产为止
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.curr_size+=size;
		System.out.println("生产"+size+",当前库存量为"+curr_size);
		//唤醒所有该对象的其他线程,通知消费者消费
		this.notifyAll();
	}
	
	/**
	 * 消费者减少库存量,注意同步
	 * @param size	消费数量
	 */
	public synchronized void minus(int size)
	{
		while(this.curr_size<size)
		{
			System.out.println("库存量"+getCurr_size()+"不足"+size+",请联系生产");
			try {
				//数量不够一直等待,直到存库达到该数量
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.curr_size-=size;
		System.out.println("消费了"+size+",当前库存量为"+curr_size);
		//唤醒所有该对象的其他线程,通知生产者生产
		this.notifyAll();
	}

}

2、编写消费者代码

package org.cyxl.thread;

/**
 * 消费者
 * @author cyxl
 *
 */
public class Consumer implements Runnable{
	private Godown godown;	//仓库
	private int num;		//消费数量
	
	public Consumer()
	{}
	
	public Consumer(Godown godown,int num)
	{
		this.godown=godown;
		this.num=num;
	}

	public Godown getGodown() {
		return godown;
	}

	public void setGodown(Godown godown) {
		this.godown = godown;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public void run() {
		//消费数量num
		godown.minus(num);
	}
	
	

}

3、编写生产者代码

package org.cyxl.thread;

/**
 * 生产者
 * @author cyxl
 *
 */
public class Producer implements Runnable{
	private Godown godown;	//仓库
	private int num;		//生产数量
	public Godown getGodown() {
		return godown;
	}
	public void setGodown(Godown godown) {
		this.godown = godown;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Producer()
	{}
	
	public Producer(Godown godown,int num)
	{
		this.godown=godown;
		this.num=num;
	}
	public void run() {
		//生产数量num
		godown.add(num);
	}
	
}

4、编写销售者,销售者作为联系生产者、消费者和仓库的桥梁

package org.cyxl.thread;

/**
 * 销售员
 * @author Administrator
 *
 */
public class Solder {
	public static void main(String[] args)
	{
		//建一个容量为200的仓库
		Godown godown=new Godown(200);
		//消费者消费20
		Consumer c1=new Consumer(godown,20);
		Thread ct1=new Thread(c1);
		ct1.start();
		//消费者消费50
		Consumer c2=new Consumer(godown,50);
		Thread ct2=new Thread(c2);
		ct2.start();
		//生产者生产30
		Producer p1=new Producer(godown,30);
		Thread pt1=new Thread(p1);
		pt1.start();
		//生产者生产80
		Producer p2=new Producer(godown,80);
		Thread pt2=new Thread(p2);
		pt2.start();
		//消费者消费30
		Consumer c3=new Consumer(godown,30);
		Thread ct3=new Thread(c3);
		ct3.start();
		
	}
}

5、测试结果

库存量0不足20,请联系生产
库存量0不足50,请联系生产
生产30,当前库存量为30
库存量30不足50,请联系生产
消费了20,当前库存量为10
库存量10不足50,请联系生产
生产80,当前库存量为90
消费了50,当前库存量为40
消费了30,当前库存量为10

四、总结

1、多线程特别应注意方法的同步

2、该程序涉及的知识点有多线程,线程同步,wait方法,notify方法或者notifyAll方法

3、以上测试的结果是随机的,但最后的结果是一定的,也就是最后的库存量为10

分享到:
评论

相关推荐

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    3)多个生产者或多个消费者之间须有共享的对缓冲区进行操作的函数代码。4) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态。提示:(1) 有界缓冲区可用数组实现。代码有详细...

    Java SE实践教程 源代码 下载

    6.5.2 生产者、消费者问题.. 137 6.6 小结 140 第7章 我要彩色照片——SWING的基本概念 141 7.1 讲解 142 7.1.1 Swing的基本概念 142 7.1.2 Swing组件继承关系 142 7.1.3 Swing组件一览 143 7.1.4 Swing和MVC...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    6.5.2 生产者、消费者问题.. 137 6.6 小结 140 第7章 我要彩色照片——SWING的基本概念 141 7.1 讲解 142 7.1.1 Swing的基本概念 142 7.1.2 Swing组件继承关系 142 7.1.3 Swing组件一览 143 7.1.4 Swing和MVC...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    6.5.2 生产者、消费者问题.. 137 6.6 小结 140 第7章 我要彩色照片——SWING的基本概念 141 7.1 讲解 142 7.1.1 Swing的基本概念 142 7.1.2 Swing组件继承关系 142 7.1.3 Swing组件一览 143 7.1.4 Swing和MVC...

    Java典型模块

    第7章 生产者与消费者问题(线程通信知识) 7.1 生产者与消费者原理 7.1.1 项目结构框架分析 7.1.2 项目功能业务分析 7.2 无线程通信的生产者与消费者项目 7.2.1 生产者类 7.2.2 消费者类 7.2.3 储存库类 7.2.4 测试...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java初学者必看

    11.5.3 运行生产者/消费者 11.6 死锁 11.7 本章习题 第12章 异常处理 12.1 异常的概念 12.2 异常的基本样式 12.3 Java异常类 12.3.1 异常类层次结构 12.3.2 异常处理方法 12.4 异常捕获 12.4.1 异常捕获...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包4

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包3

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包2

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java设计模式

    22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    Java开发技术大全 电子版

    8.4.4生产者-消费者问题实例284 8.5本章小结287 第9章运行时类型识别288 9.1RTTI的作用288 9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断...

    《操作系统原理与设计》全本

    5.3.4 记录型信号量解决生产者-消费者问题 119 5.3.5 记录型信号量解决读者-写者问题 121 5.3.6 记录型信号量解决理发师问题 123 5.3.7 AND型信号量机制 123 5.3.8 一般型信号量机制 125 5.4 管程 127 5.4.1 管程和...

Global site tag (gtag.js) - Google Analytics