`

生产者--消费者问题

阅读更多

自己在网上搜集了一些资料,然后又根据自己的理解写的,如果有问题,请指出,我将改正

 

 

package cn.henu.sjg.producerAndConsumer;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * 生产者--消费者问题
 * @author Shang Jianguo
 * @2012-12-10 下午9:42:17
 */
public class ProducerAndConsumer {
	private LinkedList<Object> container = new LinkedList<Object>(); // 作为缓冲区
	private int MAX = 10; // 缓冲区中商品的最多数量
	private boolean isEmpty = true;// 标志缓冲区是否为空

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入生产者数目:");
		int pnum = sc.nextInt();
		System.out.println("请输入消费者数目:");
		int cnum = sc.nextInt();
		
		ProducerAndConsumer pac = new ProducerAndConsumer();
		for(int i=0;i<pnum;i++){
			pac.new Producer("生产者" + i).start();
		}
		for(int i=0;i<cnum;i++){
			pac.new Consumer("消费者" + i).start();
		}
	}


	/**
	 *  生产者类
	 * @author Shang Jianguo
	 * @2012-12-10 下午9:42:36
	 */
	class Producer extends Thread {

		public Producer(String name) {
			super(name);
		}

		@Override
		public void run() {
			while (true) {
				synchronized (container) {
					if (isEmpty) {// 缓冲区为空并且没有生产
						if (MAX > container.size()) {// 向缓冲区中添加商品
							container.add("产品" + container.size());
							System.out.println(getName() + "生产了产品--" + container.getLast() );
						}
						
						isEmpty = false;
						container.notifyAll();
					} else {
						try {// 没有产品,线程等待
							container.notifyAll();
							container.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}	
				}
			}
		}
	}

	/**
	 *  消费者类
	 * @author shangjianguo
	 */
	class Consumer extends Thread {
		public Consumer(String name) {
			super(name);
		}

		@Override
		public void run() {
			while (true) {
				
				synchronized (container) {
					try {
						container.wait(1000);
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					if (!isEmpty) {// 有商品
						Object good = container.removeLast();
						System.out.println(getName() + " 消费了商品:" + good);
						if (container.isEmpty()) {// 没有商品了
							isEmpty = true;
						}
						container.notifyAll();
					} else {
						System.out.println(getName() + ":没有商品了!");
						try {
							container.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}	
					try {
						sleep(1000);
					} catch (InterruptedException e2) {
						e2.printStackTrace();
					}
					container.notifyAll();
				}
			}
		}

	}
}
 
1
1
分享到:
评论

相关推荐

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

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

    利用记录型信号量解决生产者-消费者问题.doc

    记录型信号量通常用于解决生产者-消费者问题,因为它可以记录缓冲池中的空缓冲区和满缓冲区的数量,从而实现生产者和消费者的同步。 解决生产者-消费者问题的方法 为了解决生产者-消费者问题,我们可以使用记录型...

    用多线程同步方法解决生产者-消费者问题(操作系统课设

    生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区,导致缓冲区的数据混乱和不一致的问题。 在解决生产者-消费者问题时,需要使用同步机制来...

    用多进程同步方法解决生产者-消费者问题

    在生产者-消费者问题中,可以使用互斥量(mutex)保证缓冲区的独占访问,以及使用条件变量(condition variable)实现生产者等待消费者消费或消费者等待生产者生产。 4. **互斥量**:互斥量用于实现对共享资源的...

    线程同步(生产者--消费者问题)

    生产者-消费者问题是这样设定的:一个或多个生产者线程负责生产数据,而一个或多个消费者线程则负责消费这些数据。两者共享一个有限大小的缓冲区,当缓冲区满时,生产者必须等待消费者消费后才能继续生产;反之,当...

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

    生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...

    linux下用多进程同步方法解决生产者-消费者问题源代码

    生产者-消费者问题是计算机科学中的一个经典同步问题,主要探讨如何在多个进程中有效地共享有限的资源,以防止数据竞争和死锁的发生。在Linux操作系统环境下,这个问题通常通过信号量(semaphore)或管道(pipe)等...

    以记录型信号量实现生产者-消费者问题

    以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...

    利用记录型信号量解决生产者-消费者问题

    1.利用记录型信号量解决生产者-消费者问题.odt1.利用记录型信号量解决生产者-消费者问题.odt1.利用记录型信号量解决生产者-消费者问题.odt

    进程同步与互斥 生产者与消费者问题--操作系统大作业

    生产者-消费者问题是一个经典的进程同步问题,涉及到两个进程(或线程)——生产者和消费者。生产者负责生产数据项并将其放入一个共享缓冲区,而消费者则从这个缓冲区中取出数据项进行处理。为了保证正确性,需要...

    多线程实现生产者---消费者模型

    在本场景中,我们关注的是"生产者-消费者模型",这是一个经典的并发问题,通常用于展示线程间的协作与同步。这个模型是基于一个假设:有一个缓冲区,生产者线程负责往里面放入产品,而消费者线程则负责取出并消费...

    生产者消费者问题

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

    jchc.rar_tearshmj_生产者_生产者-消费者问题 c++ _生产者和消费者_生产者消费者

    《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...

    生产者-消费者问题.cpp

    生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1...

    模拟“生产者-消费者”解决过程及方法

    "生产者-消费者"问题是一种经典的多线程同步问题,源于计算机科学中的操作系统领域,用于描述在并发环境中如何协调生产者和消费者之间的操作,确保数据的一致性和避免资源浪费。这个问题的基本设定是有一个共享缓冲...

    用多线程同步方法解决生产者-消费者问题

    生产者-消费者问题是这种并发模型的一个经典案例,它涉及到如何在多个线程间共享资源,确保数据的一致性和正确性。在这个场景中,生产者线程负责生成数据并放入一个有限的缓冲区,而消费者线程则负责从缓冲区取出...

    生产者-消费者问题的Win32实现

    生产者-消费者问题是多线程编程中的一个经典同步问题,源于操作系统理论,旨在演示如何在多个线程之间安全地共享有限资源。在这个问题中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了确保...

    生产者-消费者模型模拟进程调度

    内容:编程实现生产者-消费者问题的模拟。 基本要求: 1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10...

    四川大学操作系统课程设计高分报告-第三次实验-生产者和消费者问题.doc

    这些API函数在解决生产者-消费者问题时起到了关键作用,它们帮助管理线程的并发行为,确保生产者不会在缓冲区满时继续生产,消费者也不会在缓冲区为空时尝试消费。通过适当的同步机制,可以避免竞争条件和其他并发...

Global site tag (gtag.js) - Google Analytics