黑马程序员技术交流社区
标题:
面向对象编程问题求解
[打印本页]
作者:
张会文
时间:
2012-12-30 20:46
标题:
面向对象编程问题求解
本帖最后由 张会文 于 2012-12-31 19:04 编辑
用编程实现“模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐
(假设买盐需要3分钟),只有盐买回来之后,妈妈才能
继续做饭的过程。”这个应该具体怎么实现?这是我的最后一道试题
原来不会写,请大家一起分析一下吧?
作者:
嘿嘿小学徒
时间:
2012-12-30 23:19
本帖最后由 dustookk 于 2012-12-30 23:20 编辑
我们这学期的java课上 老师给我们出过这个题!
正确代码:
public class Test {
static class Mother extends Thread{
/** 盐的用量 */
final int SaltUseage = 40;
volatile boolean cooking = true;
Home home;
public void run(){
try {
while(cooking){
Salt salt = home.salt;
if(salt.value<SaltUseage){
home.son.buySalt();
waiting();
}
System.out.println("[妈妈]盐 ==>> 当前量:"+salt.value+" 用去量:"+SaltUseage+" 剩余量:"+(salt.value-SaltUseage));
salt.value -= SaltUseage;
otherThings();
}
} catch (Exception e) {
cooking = false;
}
}
private void otherThings() {
try {
sleep(1000);
} catch (Exception e) {
cooking = false;
}
}
private synchronized void waiting() throws InterruptedException {
System.out.println("[妈妈]盐 ==>> 当前量:"+home.salt.value+" 等待儿子去买盐。");
home.mother.wait();
}
private synchronized void notice(){
home.mother.notify();
}
}
static class Son extends Thread{
/** 盐的购买量 */
final int SaltPurchases = 60;
volatile boolean free = true;
Home home;
public void run(){
try {
while(free){
waiting();
sleep(2000);
System.out.println("[儿子]盐 ==>> 当前量:"+home.salt.value+" 购买量:"+SaltPurchases+" 剩余量:"+(home.salt.value+SaltPurchases));
home.salt.value += SaltPurchases;
notice();
}
} catch (Exception e) {
free = false;
}
}
public synchronized void buySalt(){
notify();
}
private void notice() {
System.out.println("[儿子]盐 ==>> 当前:"+home.salt.value+" 盐已买到。");
home.mother.notice();
}
private synchronized void waiting() throws InterruptedException {
System.out.println("[儿子]盐 ==>> 当前:"+home.salt.value+" 等下次买。");
wait();
}
}
static class Salt{
int value = 90;
}
static class Home{
Mother mother = new Mother();
Son son = new Son();
Salt salt = new Salt();
public Home(){
mother.home = this;
son.home = this;
}
public void startCooking(){
mother.start();
son.start();
}
public void stopCooking(){
mother.cooking=false;
son.free=false;
mother.interrupt();
son.interrupt();
}
}
/**
* Test
*/
public static void main(String[] args) throws Exception {
Home home = new Home();
home.startCooking();
Thread.sleep(15000);
home.stopCooking();
}
}
复制代码
作者:
肖志锋
时间:
2012-12-30 23:57
其实就是一个多线程同步的问题,执行权的释放以及唤醒,你去参考一下生产者消费者问题,其实你这个题目就用那个模版就行了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2