`

生产者消费者模式之我的理解

 
阅读更多

我发现不管从什么话题,都能扯到Thread上面,例如:

同步-》安全-》多线程,

Core Java-》IO-》多线程,

框架-》底层-》多线程,

这样的话题导致最后的结束点,往往集中在多线程,虽然实际开发中线程级的编程,普通程序员几乎碰不到,但是还是需要我们有所了解。

找了一个生产者/消费者模式的例子,线程的很多功能的问题,都可以由它来阐述。这个例子可以用List,Stack等多种方式来模拟,这里采用最简单一个共享int,只为理解生产和消费的原理。

 

Store仓库类,为生产者和消费者所共享。对增减上锁,同步执行:

public class Store {
	private final int MAX_SIZE;
	private int count;
	public Store(int n) {
		this.MAX_SIZE = n;
		count = 0;
	}
	public synchronized void add() {
		while (count >= MAX_SIZE) {
			System.out.println("已经满了。");
			try {
				this.wait();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		count++;
		System.out.println(Thread.currentThread().toString() + " put " + count);
		this.notifyAll();
	}
	public synchronized void remove() {
		while (count <= 0) {
			System.out.println("空了 ");
		}
		try {
			this.wait();
		} catch (Exception e) {
			e.printStackTrace();
		}
		count--;
		System.out.println(Thread.currentThread().toString() + " get " + count);
		this.notify();
	}
	public static void main(String arg[]) {
		Store store = new Store(5);
		Thread pro = new Producer(store);
		Thread con = new Consumer(store);
		pro.setName("product");
		con.setName("consumer");
		Thread pro1 = new Producer(store);
		Thread con1 = new Consumer(store);
		pro1.setName("product1");
		con1.setName("consumer1");

		pro.start();
		con.start();
		pro1.start();
		con1.start();
	}
}

 

Producer生产者类。不停的add产品。每次生产后,等待1000ms,直至仓库装满。

public class Producer extends Thread {
	private Store store;
	public Producer(Store store) {
		this.store = store;
	}
	public void run() {
		while (true) {
			store.add();
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

Consumer消费者类。不停的remove产品,每次减少产品后,等待1000ms,直至仓库为空。

public class Consumer extends Thread {
	private Store store;
	public Consumer(Store store) {
		this.store = store;
	}
	public void run() {
		while (true) {
			store.remove();
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

 贴上运行的结果:

Thread[product,5,main] put 1
Thread[product1,5,main] put 2
Thread[consumer,5,main] get 1
Thread[product1,5,main] put 2
Thread[consumer1,5,main] get 1
Thread[product,5,main] put 2
Thread[consumer,5,main] get 1
Thread[product1,5,main] put 2
Thread[product,5,main] put 3
Thread[consumer,5,main] get 2
Thread[consumer1,5,main] get 1
Thread[product1,5,main] put 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product1,5,main] put 3
Thread[product,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product1,5,main] put 3
Thread[product,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product1,5,main] put 3
Thread[product1,5,main] put 4
Thread[product,5,main] put 5
Thread[consumer1,5,main] get 4
Thread[consumer,5,main] get 3
Thread[product1,5,main] put 4
Thread[product,5,main] put 5
Thread[consumer,5,main] get 4
Thread[consumer1,5,main] get 3
Thread[product,5,main] put 4
Thread[product1,5,main] put 5
Thread[consumer1,5,main] get 4
Thread[consumer,5,main] get 3
Thread[product,5,main] put 4
Thread[product1,5,main] put 5
Thread[consumer1,5,main] get 4
Thread[consumer,5,main] get 3
Thread[product1,5,main] put 4
Thread[product,5,main] put 5
已经满了。
已经满了。

 

 

分享到:
评论

相关推荐

    多进程同步-生产者消费者模式-C实现

    读《深入理解计算机系统》后,参照书中程序,用C代码实现生产者消费者模型,本代码可移植性强,各接口以封装好,并有注释

    linux下C++实现生产者和消费者问题

    linux下C++实现生产者和消费者问题,并及时输出缓存区的状态,方便理解。代码中有详细的注释,方便阅读。

    生产者消费者模式+定时任务demo

    主要是自己为了学习与加深生产者消费者模式的理解,写的一个demo,里面还包含一个定时任务,只用了一下spring的框架(也可以不用的)

    生产者-消费者模型模拟进程调度,带报告,课程设计

    1.生产者消费者对缓冲区进行互斥操作。 2.缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3.生产者消费者各循环操作50次。 四、设计思路和采取的方案 1.利用windows提供的API...

    理解生产者消费者模型及在Python编程中的运用实例

    在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,生产者负责往仓库了进商 品,而消费者负责从仓库里拿商品,这就构成了生产者消费者模型。结构图如下: 生产者消费者模型的优点: 1、解耦 假设生产者和...

    计算机操作系统课程设计报告《生产者---消费者问题》.doc

    生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消 费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不 用等待消费者处理,直接扔给阻塞队列,消费者不找...

    RabbitMQ消息模式之Confirm确认消息

    消息的确认,是指生产者投递消息后,如果Broker收到消息,则会给我们生产者一个应答。生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是消息的可靠性投递的核心保障 消费端代码: ...

    23种极容易理解的设计模式

    写的很生动很幽默: 1、FACTORY—追MM少不了请...消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

    我对新媒体的认识和理解.docx

    对于网络电视和手机电视而言,消费者同时也是生产者。 3.人们使用新媒体的目的性与选择的主动性更强。 4.媒体使用与内容选择更具个性化,导致市场细分更加充分。 优势:传播与更新速度快,成本低 信息量大,内容丰富...

    java模拟阻塞队列

    实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程

    Spring Cloud Data Flow流式和批式数据处理框架Local模式运行.docx

    (1)Source:消息生产者,负责把消息发送到某个目标; (2)Sink:消息消费者,负责从某个目标读取消息; (3)Processor:联合Source和Sink,它从某个目标消费消息,然后发送到另一个目标。

    java多线程处理教学案例

    一个简单的java多线程的开发案例。简单并易于理解,同时附加 生产者消费者模式

    2小时学会SpringBoot整合RabbitMQ详解

     - 项目实战中如何使用RabbitMQ,以及RabbitMQ的作用 消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的...

    电子商务下的网上支付方式分析研究

    电子商务下的网上支付方式分析研究...基于以上理解,文章通过对各种网上支付方式的具体分析对比,期望加深消费者对网上支付的认识,以更好的促进网上支付及我国电子商务的发展。 关键词 :电子商务 网上支付 第三方支付

    JAVA高并发高性能高可用高扩展架构视频教程

    高并发之单(多)生产者消费者线程 高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码...

    ActiveMQ消息中间件面试专题.zip

    全面覆盖ActiveMQ相关知识点:这份面试专题资料涵盖了ActiveMQ的多个方面,包括基础知识、消息生产者和消费者、消息传递模式等等。它可以帮助应聘者全面掌握ActiveMQ的相关知识点,提高应聘的成功率。 精简易懂:每...

    电子商务网站调研报告(1).doc

    京东商城是中国B2C 市场最大的3C网购专业平台,是中国电子商务领域最受消费者和最具影响力的电子商务 网站之一。京东是垂直综合化的平台。它的经营模式是"用纯互联网的方式来整合上下游 ,优化供应链,在成本方面下...

    电子商务网站调研报告.doc

    京东商城是中国B2C 市场最大的3C网购专业平台,是中国电子商务领域最受消费者和最具影响力的电子商务 网站之一。京东是垂直综合化的平台。它的经营模式是"用纯互联网的方式来整合上下游 ,优化供应链,在成本方面下...

Global site tag (gtag.js) - Google Analytics