生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
一,首先定义公共资源类,其中的变量number是保存的公共数据。并且定义两个方法,增加number的值和减少number的值。由于多线程的原因,必须加上synchronized关键字,注意while判断的条件。
package com.wjy.resources; public class PublicResource { private int number=0; private static final int MAX_CAPACITY=3; /** * increase resource */ /** * 增加公共资源 */ public synchronized void increace(String threadName) { while (number >=MAX_CAPACITY) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } number++; System.out.println("Producer "+threadName+" product one: "+number); notify(); } /** * 减少公共资源 */ public synchronized void decreace(String threadName) { while (number == 0) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } number--; System.out.println("Consumer "+threadName+" consume one: "+number); notify(); } }
二,分别定义生产者线程和消费者线程,并模拟多次生产和消费,即增加和减少公共资源的number值
package com.wjy.producer; import com.wjy.resources.PublicResource; public class ProducerThread implements Runnable{ private PublicResource resource; private String threadName; /** * 这样的构造函数可以使得生产者和消费者们共享公共资源,只要他们依赖的是同一个公共资源的对象。 */ public ProducerThread(PublicResource resource,String threadName) { this.resource = resource; this.threadName=threadName; } @Override public void run() { /** * 生产者的生产次数 */ for (int i = 0; i < 5; i++) { try { Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } resource.increace(threadName); } } }
package com.wjy.consumer; import com.wjy.resources.PublicResource; public class ConsumerThread implements Runnable{ private PublicResource resource; private String threadName; /** * 这样的构造函数可以使得生产者和消费者们共享公共资源,只要他们依赖的是同一个公共资源的对象。 */ public ConsumerThread(PublicResource resource,String threadName) { this.resource = resource; this.threadName=threadName; } @Override public void run() { /** * 消费者的消费次数 */ for (int i = 0; i < 5; i++) { try { Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } resource.decreace(threadName); } } }
三,模拟多个生产者和消费者操作公共资源的情形,结果须保证是在允许的范围内。
package client; import com.wjy.consumer.ConsumerThread; import com.wjy.producer.ProducerThread; import com.wjy.resources.PublicResource; /** * This is an example that has three producers,two consumers. */ public class Client { public static void main(String[] args) { PublicResource resource = new PublicResource(); Thread producerOne=new Thread(new ProducerThread(resource,"'生产者1号'")); Thread producerTwo=new Thread(new ProducerThread(resource,"'生产者2号'")); Thread producerThree=new Thread(new ProducerThread(resource,"'生产者3号'")); Thread consumerOne=new Thread(new ConsumerThread(resource,"'消费者1号'")); Thread consumerTwo=new Thread(new ConsumerThread(resource,"'消费者2号'")); producerOne.start(); consumerOne.start(); consumerTwo.start(); producerTwo.start(); producerThree.start(); } }
相关推荐
java实现生产者消费者问题 本实验报告的目的是通过编写Java程序实现生产者消费者问题,掌握进程同步和互斥的方法,学习使用信号量机制解决进程互斥问题。 一、实验原理 生产者消费者问题是操作系统中最基本的同步...
5. **死锁避免**: 在实现生产者-消费者问题时,必须注意死锁的可能。例如,如果生产者在放入元素前先等待消费者消费,而消费者在取出元素前又等待生产者生产,就可能出现死锁。合理设计同步机制和条件变量的使用可以...
在Java中,`java.util.concurrent`包下的`BlockingQueue`接口提供了一种线程安全的数据结构,非常适合用于实现生产者消费者模式。生产者将产品放入队列,消费者从队列中取出产品。`BlockingQueue`提供了`put()`和`...
这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...
Java实现生产者消费者问题与读者写者问题详解 Java语言在多线程编程中提供了对同步机制的良好支持,解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步;(2)在生产者和消费...
在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
在CSDN.NET博客文章中,作者详细讨论了如何使用线程同步和等待的应用来解决此问题,并提供了示例代码ProducerConsumer.java和ProducerConsumerx.java,这些代码可以帮助读者更好地理解和实现生产者消费者模型。...
下面,我们将详细讨论如何使用Java实现生产者消费者问题: 1. **创建BlockingQueue**:首先,我们需要创建一个`BlockingQueue`实例,如`ArrayBlockingQueue`,设置其容量为缓冲区大小。 ```java BlockingQueue...
下面详细阐述如何使用Java实现生产者消费者问题: 1. **使用BlockingQueue**:创建一个固定大小的`BlockingQueue`作为共享缓冲区。例如,可以使用`ArrayBlockingQueue`,它是一个基于数组的阻塞队列。 ```java ...
例如,可以使用`ArrayBlockingQueue`来实现生产者消费者问题: ```java import java.util.concurrent.ArrayBlockingQueue; class Buffer { private final ArrayBlockingQueue<Integer> queue = new ...
下面是一个简单的Java实现生产者消费者问题的例子: 1. 首先,定义一个`BlockingQueue`实例作为缓冲区: ```java import java.util.concurrent.ArrayBlockingQueue; BlockingQueue<Integer> buffer = new ...
通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。
基本满足操作系统课上要求,java实现的生产者消费者模型。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
操作系统中的生产者-消费者问题是多线程编程中的经典案例,主要用来展示线程同步和通信的概念。在这个Java实现中,我们将深入理解这个问题的背景、原理以及如何通过Java的并发工具来解决。 生产者-消费者问题的基本...