当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

生产者--消费者问题

发表于: 2012-12-11   作者:商人shang   来源:转载   浏览:
摘要: 自己在网上搜集了一些资料,然后又根据自己的理解写的,如果有问题,请指出,我将改正     package cn.henu.sjg.producerAndConsumer; import java.util.LinkedList; import java.util.Scanner; /** * 生产者--消费者问题 * @author Shang

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

 

 

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();
				}
			}
		}

	}
}
 

生产者--消费者问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
java线程的生命周期 /** * 公共资源类 */ public class PublicResource { private int number = 0;
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将
最近在学习多线程,自己尝试写了下生产者消费者问题, 思路: 1、使用两个信号量表示缓冲区中可以取
wait()和notify()¬ifyAll()必须工作在加锁(synchronized)的代码块中。 抢占的锁和释放的锁要是
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将
问题描述:有一群生产者进程在不断生产产品,而另一群消费者进程在不断消费生产出的产品;为了了解
/** * 灰烬之灵EM(同一场景、同一资源) */ public class EM { /** * 最大充能数量 */ private final
生产者-消费者问题(producer - consumer)是一个著名的进程同步问题;今天我们用加入“”等待与唤
之前感觉很简单,但是有一次面试让我在纸上写,居然没写对丢人啊。 生产者消费者问题(Producer-con
继经典线程同步问题之后,我们来看看生产者消费者问题及读者写者问题。生产者消费者问题是一个著名
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号