`

生产者--消费者问题

阅读更多

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

 

 

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics