生产者消费者模型,其实就是一个(生产者)负责产生数据,另一个(消费者)负责使用数据,这里的数据就是生产者和消费者共用的资源,为了让生产者和消费者能有序地使用公共资源,需要引入锁(synchronized)的概念----在一段代码中,将那一段需要很多线程共同使用的代码(相当于共享资源)用synchronized关键字定义,相当于给这一段区域进行了加锁,当有线程来操作它时,就会对其加锁,其他的线程在此时若准备操作它只能排队等待,等第一个线程操作完成,锁解除之后,才能操作。
下面实现的生产消费模型主要是:
1.仓库中无产品时,生产者开始生产一件放入仓库,通知消费者来取;
2.消费者从仓库中取出产品后,仓库没有库存,通知生产者去继续生产。
3.生产者和消费者是两个互不干扰的线程,但是又有一定的联系,联系就是通过仓库这个被锁定的区域实现的。
4.wait()和notify()方法就是生产者和消费者线程之间的联系,当一方在使用公共资源时,另一方的状态为wait,当这一方使用公共资源完毕后,会notify(通知)等待的一方。
生产者代码:
package Producer_customer0123; import java.util.List; public class ProducerThread extends Thread { private List<Things> thingslist;//产品队列 int count=0; public ProducerThread(List<Things> thingslist){ this.thingslist=thingslist; } public void run(){ while(true){ //休眠2秒 try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } synchronized (thingslist) { while(thingslist.size()>0){//如果有产品,则等待 try { thingslist.wait(); System.out.println("生产者在等待-------生产者线程"); } catch (InterruptedException e) { e.printStackTrace(); } } while(thingslist.size()==0){//如果没有产品,则生产产品,并且通知消费者 Things newthing=new Things(); count++; newthing.id=count; newthing.name="第"+count+"个产品"; thingslist.add(newthing);//加入到队列中 thingslist.notify();//通知消费者 System.out.println("生产者生产了"+count+"号产品-------生产者线程"); } } } } }
消费者代码:
package Producer_customer0123; import java.util.List; public class CustomerThread extends Thread{ private List<Things> thingslist; public CustomerThread(List<Things> thingslist) { this.thingslist=thingslist; } public void run(){ while(true){ synchronized (thingslist) { while(thingslist.size()>0){//如果队列中有产品,消费者就取出来 for(int i=0;i<thingslist.size();i++){ thingslist.remove(i); thingslist.notify(); System.out.println("消费者取出了队列中第"+i+"号产品----消费者线程"); } } while(thingslist.size()==0){ try { System.out.println("队列中已没有产品了----消费者线程"); thingslist.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } }
主函数:
package Producer_customer0123; import java.util.LinkedList; import java.util.List; public class Test { public static void main(String args[]){ //创建队列 List<Things> thingslist=new LinkedList<Things>() ; //启动线程 ProducerThread producer=new ProducerThread(thingslist); CustomerThread customer=new CustomerThread(thingslist); producer.start(); customer.start(); } }
运行结果如下:
结论:通过打印会发现生产者线程和消费者线程会按照某一个顺序依次对thingslist进行操作,对比两段线程的代码,会发现,一个很大的不同就是wait()和notify()的时机,生产者和消费者总是相反的,这也正好解释了在同一时刻,thingslist只允许一个线程对他进行操作。
以上就是我对生产消费模型的一些认识。
相关推荐
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
基本满足操作系统课上要求,java实现的生产者消费者模型。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
Java实现生产者消费者模型 生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一个控制队满,一个 控制队空 //生产者 ...
以车库为例子,一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。 根据进程同步机制,编写一个解决上述问题的可视化程序,可显示缓冲池状态、放数据、取数据等...
消息分发框架,基于java阻塞队列实现,生产者消费者模型 可用于任务分发,服务器消息消息,以及网络IO 性能优化,多线程
ProducerAndConsumer 生产者和消费者模型java实现
主要介绍了Java实现简易生产者消费者模型过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
操作系统,生产者消费者问题和先来先服务算法,java语言编写。
主要介绍了Java多线程 BlockingQueue实现生产者消费者模型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
最近在复习操作系统,随手写两种Java实现生产者消费者模型的方式 一、信号量 import java.util.Queue; import java.util.Random; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent....
主要介绍了Java基于Lock的生产者消费者模型,结合实例形式分析了java基于锁机制的生产者消费者模型相关实现与使用技巧,需要的朋友可以参考下
本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程...这是一个用Eclipse为工具、java为编程语言而实现模拟消费者进程与生产者进程的同步。
java课程:MyCDshop类实现,生产者消费者模型的变形,加入了租借归还这一过程
"Java实现Kafka数据生产者"这个功能可以让你使用Java编程语言创建一个能够连接到指定的Kafka集群(通过bootstrap servers)并向其中发送数据的应用程序。通过这个功能,你可以将数据以消息的形式发送到Kafka主题中,...
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者...
主要介绍了Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析,涉及queue,BlockingQueue等有关内容,具有一定参考价值,需要的朋友可以参考。