生产者消费者模型,其实就是一个(生产者)负责产生数据,另一个(消费者)负责使用数据,这里的数据就是生产者和消费者共用的资源,为了让生产者和消费者能有序地使用公共资源,需要引入锁(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模拟程序中,我们实现了生产者/消费者模型的关键元素:有限的缓冲区、线程同步和信号机制。通过`wait()`和`notifyAll()`方法,生产者和消费者能够正确地协同工作,避免了数据竞争和死锁。这个例子展示了...
在给定的压缩包文件"生产者与消费者代码"中,很可能包含了实现这一模型的示例代码。通过阅读和分析这些代码,你可以更好地理解如何在实际项目中应用生产者/消费者模型。例如,你可能会看到如何创建线程,如何初始化...
基本满足操作系统课上要求,java实现的生产者消费者模型。
本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...
在JAVA中,实现生产者/消费者模型通常涉及到线程的概念。JAVA提供了一套丰富的API来支持多线程编程,这使得开发者能够轻松地构建复杂的并发应用程序。通过结合使用JAVA的线程和同步机制,可以有效地解决生产者/消费...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
Java中实现生产者消费者模型通常会用到以下关键概念和技术: 1. **阻塞队列(BlockingQueue)**:这是生产者消费者模型的核心组件,用于存储待消费的数据。Java的`java.util.concurrent`包提供了多种阻塞队列实现,...
这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...
在生产者消费者问题的Java实现中,通常会使用一个有界缓冲区来存储数据。这个缓冲区可以用数组或`BlockingQueue`来实现。`BlockingQueue`是一个线程安全的数据结构,它内置了同步机制,可以避免死锁和资源浪费。 ...
3. **生产者消费者模型的实现步骤**: - 创建一个阻塞队列作为共享数据结构。 - 生产者线程负责向队列中添加元素,当队列满时,调用`put()`方法会阻塞生产者。 - 消费者线程负责从队列中移除元素,当队列空时,...
总结,Java实现的生产者消费者模式利用`BlockingQueue`接口来协调生产者和消费者的动作,确保资源的有效管理和合理分配。通过这种方式,我们可以构建高效、稳定且线程安全的并发程序。在`src`文件夹中,可能包含的是...
`BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
Java实现生产者消费者模型 生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一个控制队满,一个 控制队空 //生产者 ...
下面是一个简单的生产者消费者问题的Java实现: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerProblem { public static void main(String[] args) { ...
### 生产者消费者模型在Java中的实现 #### 概述 生产者消费者模型是一种经典的多线程编程模式,被广泛应用于解决并发环境下的数据生产和消费问题。在这个模型中,“生产者”负责创建数据并将其放入缓冲区(通常是...
在Java中实现生产者-消费者模型时,通常会用到`java.lang.Thread`类或`java.util.concurrent.ExecutorService`接口来创建和管理线程,同时利用`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法来实现...
在这个Java实现中,我们将深入理解这个问题的背景、原理以及如何通过Java的并发工具来解决。 生产者-消费者问题的基本场景是:有一个共享资源(如一个缓冲区),生产者线程负责往这个缓冲区填入数据,而消费者线程...
以下是对生产者-消费者问题及其Java实现的详细解析: 1. **生产者-消费者模型**: - **生产者**:负责生产数据并将其放入一个共享的数据缓冲区。 - **消费者**:从共享缓冲区中取出数据并进行处理。 - **缓冲区*...