多线程经典问题:馒头问题 生产和消费问题(线程的通信问题)

生产者消费者问题,涉及到几个类

* 既然是生产者、消费者,那么生产者类和消费者类就是必须的

 *生产什么,消费什么,所有物品类是必须的,这里是馒头类

 *既然是线程,那么就不是一对一的,也就是说不是生产一个消费一个,既然这样,多生产的往哪里放,

 *  现实中就是筐了,在计算机中也就是数据结构,筐在数据结构中最形象的就是栈了,因此还要一个栈类

package com.mt;

/**
 * 馒头类
 * 
 * @author Administrator
 *
 */
public class Mt {
	// 馒头的编号
	int number;

	// 馒头的构造方法
	public Mt(int number) {
		this.number = number;

	}

	// toString重写方法
	@Override
	public String toString() {
		return "Mt [number=" + number + "]";
	}

}

package com.mt;

/**
 * 馒头筐 存馒头和取馒头都在这里面进行编订方法
 * 
 * @author Administrator
 *
 */
public class Kuang {
	// 定义一个馒头 筐可以放多少馒头的变量的定义(筐盖)
	int index = 0;
	// 馒头筐可以装多少个 用数组表示
	Mt[] mt = new Mt[6];

	// 装馒头的方式
	public synchronized void zhuang(Mt m) throws Exception {
		// 如果装满就停止等待
		if (mt.length == index) {
			wait();
		}
		// 然后唤醒其他的 线程
		notify();
		mt[index] = m;
		index++;
		System.out.println("装进馒头" + m);
	}

	// 往外面拿馒头
	public synchronized Mt na() throws Exception {
		// 当馒头见底 没馒头了 就停止 等待 然后唤醒其他的线程
		if (index == 0) {
			wait();
		}
		notify();
		System.out.println("拿出馒头" + index);
		index--;
		return mt[index];

	}

}

package com.mt;

/**
 * 馒头的生产者
 * 
 * @author Administrator
 *
 */
public class ShengChan extends Thread {
	Kuang s;

	// 因为 线程的资源是唯一的 这里筐就是唯一的 将筐传进来
	public ShengChan(Kuang s) {
		this.s = s;
	}

	@Override
	public void run() {
		// 生产馒头
		for (int i = 1; i <= 20; i++) {
			Mt m = new Mt(i);
			System.out.println("生产了馒头" + i);
			try {
				// 生产了 装进框里 每生产1个休息10毫秒
				s.zhuang(m);
				Thread.sleep(10);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
package com.mt;

/**
 * 馒头的消费者
 * 
 * @author Administrator
 *
 */
public class XiaoFei extends Thread {
	Kuang s;

	// 将筐传进来
	public XiaoFei(Kuang s) {
		this.s = s;
	}

	@Override
	public void run() {
		// 线程消费馒头
		for (int i = 1; i <= 20; i++) {
			try {
				// 每消费一个休息100毫秒
				Thread.sleep(100);
				s.na();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}

package com.mt;

/**
 * 测试类 测试是否可行
 * 
 * @author Administrator
 *
 */
public class Test {
	public static void main(String[] args) {
		// new一个框 因为都需要框
		Kuang k = new Kuang();
		ShengChan s = new ShengChan(k);
		s.start();
		XiaoFei x = new XiaoFei(k);
		x.start();
	}

}



你可能感兴趣的:(java)