`
zyslovely
  • 浏览: 227760 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

经典生产者和消费者的问题

 
阅读更多
<span style="font-size:16px;">package demo.thread;

/**
 *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。
 *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品 
 */

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;
	}
}
</span>
分享到:
评论

相关推荐

    多生产者与多消费者问题c++源码

    多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多...

    生产者消费者问题总结

    生产者消费者问题总结 信号量概念总结 经典生产者-消费者问题 较为复杂的生产者-消费者问题 华南理工大学生产者和消费者问题 个人总结

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    生产者消费者问题

    生产者消费者问题,C++。生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者...

    用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...

    操作系统实验报告经典的生产者—消费者问题.doc

    操作系统实验报告经典的生产者—消费者问题.doc

    Linux下生产者消费者问题的实现

    利用互斥锁和计数信号完成生产者消费者问题 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中...

    操作系统课程设计生产者和消费者问题源代码

    (1)创建生产者和消费者线程 在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 ...

    java模拟生产者和消费者问题

    用java模拟生产者和消费者在缓冲区间的阻塞情况。

    生产者-消费者问题的模拟实现(课设含源代码).doc

    用进程同步方法解决“生产者-消费者”问题,C或C++语言实现。 1、设计目的 通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示...

    操作系统实验报告经典的生产者—消费者问题.pdf

    操作系统实验报告经典的生产者—消费者问题.pdf

    生产者消费者问题C/C++源程序

    操作系统中典型的同步问题,m个生产者,n个消费者链接在具有k个单位缓冲区的有界环形缓冲区上,生产者和消费者是并发线程,只要缓冲区未满,生产者线程就可以生产一件产品放入其中,只要缓冲区不空,消费者就可以...

    第二章-5经典的生产者─消费者问题.ppt

    第二章-5经典的生产者─消费者问题.ppt第二章-5经典的生产者─消费者问题.ppt第二章-5经典的生产者─消费者问题.ppt第二章-5经典的生产者─消费者问题.ppt

    生产者和消费者问题(操作系统中的经典问题)

    进程中创建多个线程模拟生产者和消费者,并且满足以下要求:生产者可以把产品放到任意缓冲区中,消费者只消费指定生产者的产品,且为各生产者分配缓冲区时,各生产者必须互斥,各生产者的具体活动并发,而消费者只有...

    Win丨linux丨操作系统实验二:生产者——消费者问题

    操作系统实验二:生产者——消费者问题 1. 在Windows操作系统上,利用Win32 API提供的信号量机制,编写应用程序实现生产者——消费者问题。 2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序...

    编程模拟生产者和消费者问题

    模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。

    生产者消费者问题(操作系统多线程经典问题)

    缓冲区没满:生产者可以生产 缓冲区没空:消费者可以消费 生产消费可以同时进行 生产者、消费者、产品、缓冲区的数量可以自定义

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

Global site tag (gtag.js) - Google Analytics