您的位置:首页 > 其它

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

2017-08-12 17:12 253 查看
生产者消费者问题,涉及到几个类

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

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

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

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

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐