这是个线程同步的经典例子,源代码如下:
/**
*经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。
*其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品
*/
public class ProducersAndConsumers {
public static void main(String[] args) {
Storage storage = new Storage();
Thread consumer = new Thread(new Consumer(storage));
consumer.setName("消费者");
Thread producer = new Thread(new Producer(storage));
producer.setName("生产者");
consumer.start();
producer.start();
}
}
/**
* 消费者
*/
class Consumer implements Runnable {
private Storage storage;
public Consumer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
storage.pop();
}
}
/**
* 生产者
*/
class Producer implements Runnable {
private Storage storage;
public Producer(Storage storage) {
this.storage = storage;
}
@Override
public void run() {
Product product = new Product("090505105", "电话");
storage.push(product);
}
}
/**
* 产品类
*/
class Product {
private String id;// 产品id
private String name;// 产品名称
public Product(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "(产品ID:" + id + " 产品名称:" + name + ")";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
*仓库
*/
class Storage {
// 仓库容量为10
private Product[] products = new Product[10];
private int top = 0;
// 生产者往仓库中放入产品
public synchronized void push(Product product) {
while (top == products.length) {
try {
wait();//仓库已满,等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//把产品放入仓库
products[top++] = product;
System.out.println(Thread.currentThread().getName() + " 生产了产品"
+ product);
notifyAll();//唤醒等待线程
}
// 消费者从仓库中取出产品
public synchronized Product pop() {
while (top == 0) {
try {
wait();//仓库空,等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//从仓库中取产品
--top;
Product p = new Product(products[top].getId(), products[top].getName());
products[top] = null;
System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);
notifyAll();//唤醒等待线程
return p;
}
}
分享到:
相关推荐
C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...
"生产者消费者问题C++代码实现" 生产者消费者问题是一个经典的进程同步问题,该问题最早由 Dijkstra 提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品...
这个C++实现的生产者消费者问题展示了线程间通信和同步的基本方法,它是多线程编程中的重要知识点,对于理解和解决复杂并发问题有着重要意义。通过深入学习和实践,我们可以更好地掌握多线程编程,并在实际项目中...
生产者消费者问题进程实现 在计算机科学中,生产者消费者问题(Producer-Consumer problem)是操作系统中的一种典型问题。它描述了两个或多个进程之间的协作关系,其中一个或多个生产者进程生产数据,并将其存储在...
总之,MFC实现的生产者消费者问题展示了如何在多线程环境下有效管理共享资源,这对于理解和解决并发编程中的挑战非常有帮助。通过实践和学习这样的示例,开发者可以提升在Windows平台下进行多线程编程的能力。
以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...
在这个实验“进程同步实验——生产者与消费者问题算法实现”中,我们探讨了一个经典的并发问题:生产者-消费者问题。 生产者-消费者问题是多线程编程中的一种典型应用场景,模拟了实际生产流水线的过程。在这个问题...
在多线程环境中,生产者消费者模型和读者写者问题是经典的并发控制问题,它们都涉及到资源共享与同步。本主题将深入探讨如何使用编程来解决这两个问题。 首先,生产者消费者问题是多线程并发控制中的一个经典例子。...
在操作系统中,生产者-消费者问题是多线程和并发编程中的一个经典问题,它涉及到资源的共享和同步。本大作业旨在让学生理解并熟练运用POSIX提供的同步机制,特别是互斥锁和条件变量,来解决这个问题。以下是相关知识...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
利用互斥锁和计数信号完成生产者消费者问题 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中...
为了解决生产者消费者问题,需要使用信号量机制来实现线程之间的同步。 在给定的文件中,提供了使用信号量法解决生产者消费者问题的方案。该方案包括以下几个部分: 1. 实现平台:该程序在 Windows 操作系统上,...
生产者和消费者问题的解决方案需要使用PV操作来实现同步,以避免生产者和消费者之间的冲突。 实验目的和要求是模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。实验环境是Windows操作系统和...
生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...
在实现生产者消费者问题时,通常会使用到数据结构如循环队列和堆栈来模拟缓冲区。循环队列是一个线性结构,可以避免数组在两端添加和删除元素时的边界问题,而堆栈则是一种后进先出(LIFO)的数据结构,适用于顺序...
PV操作实现生产者消费者问题 PV操作是由P操作原语和V操作原语组成的,对信号量进行操作。P操作相当于申请资源,而V操作相当于释放资源。在了解PV操作的含义后,利用PV操作可以实现生产者消费者问题。 一、生产者...
此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...
### 利用管程与信号量解决生产者消费者问题 #### 概述 生产者-消费者问题是计算机科学中一个经典的问题,它用于演示进程间通信和同步的基本概念。该问题通常涉及一组生产者进程(负责生成数据)和一组消费者进程...