A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张会文 中级黑马   /  2012-12-30 20:46  /  1252 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张会文 于 2012-12-31 19:04 编辑

   用编程实现“模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐
(假设买盐需要3分钟),只有盐买回来之后,妈妈才能
继续做饭的过程。”这个应该具体怎么实现?这是我的最后一道试题
原来不会写,请大家一起分析一下吧?

评分

参与人数 1黑马币 +1 收起 理由
刘芮铭 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 dustookk 于 2012-12-30 23:20 编辑

我们这学期的java课上 老师给我们出过这个题!  
正确代码:
  1. public class Test {

  2.         static class Mother extends Thread{
  3.                 /** 盐的用量 */
  4.                 final int SaltUseage = 40;
  5.                 volatile boolean cooking = true;
  6.                 Home home;
  7.                 public void run(){
  8.                         try {
  9.                                 while(cooking){
  10.                                         Salt salt = home.salt;
  11.                                         if(salt.value<SaltUseage){
  12.                                                 home.son.buySalt();
  13.                                                 waiting();
  14.                                         }
  15.                                         System.out.println("[妈妈]盐  ==>> 当前量:"+salt.value+" 用去量:"+SaltUseage+" 剩余量:"+(salt.value-SaltUseage));
  16.                                         salt.value -= SaltUseage;
  17.                                         otherThings();
  18.                                 }
  19.                         } catch (Exception e) {
  20.                                 cooking = false;
  21.                         }
  22.                 }
  23.                 private void otherThings() {
  24.                         try {
  25.                                 sleep(1000);
  26.                         } catch (Exception e) {
  27.                                 cooking = false;
  28.                         }
  29.                 }
  30.                 private synchronized void waiting() throws InterruptedException {
  31.                         System.out.println("[妈妈]盐  ==>> 当前量:"+home.salt.value+"  等待儿子去买盐。");
  32.                         home.mother.wait();
  33.                 }
  34.                 private synchronized void notice(){
  35.                         home.mother.notify();
  36.                 }
  37.         }
  38.         static class Son extends Thread{
  39.                 /** 盐的购买量 */
  40.                 final int SaltPurchases = 60;
  41.                 volatile boolean free = true;
  42.                 Home home;
  43.                 public void run(){
  44.                         try {
  45.                                 while(free){
  46.                                         waiting();
  47.                                         sleep(2000);
  48.                                         System.out.println("[儿子]盐  ==>> 当前量:"+home.salt.value+" 购买量:"+SaltPurchases+" 剩余量:"+(home.salt.value+SaltPurchases));
  49.                                         home.salt.value += SaltPurchases;
  50.                                         notice();
  51.                                 }
  52.                         } catch (Exception e) {
  53.                                 free = false;
  54.                         }
  55.                 }
  56.                 public synchronized void buySalt(){
  57.                         notify();
  58.                 }
  59.                 private void notice() {
  60.                         System.out.println("[儿子]盐  ==>> 当前:"+home.salt.value+" 盐已买到。");
  61.                         home.mother.notice();
  62.                 }
  63.                 private synchronized void waiting() throws InterruptedException {
  64.                         System.out.println("[儿子]盐  ==>> 当前:"+home.salt.value+" 等下次买。");
  65.                         wait();
  66.                 }
  67.         }
  68.         static class Salt{
  69.                 int value = 90;
  70.         }
  71.         static class Home{
  72.                 Mother mother = new Mother();
  73.                 Son son = new Son();
  74.                 Salt salt = new Salt();
  75.                 public Home(){
  76.                         mother.home = this;
  77.                         son.home = this;
  78.                 }
  79.                 public void startCooking(){
  80.                         mother.start();
  81.                         son.start();
  82.                 }
  83.                 public void stopCooking(){
  84.                         mother.cooking=false;
  85.                         son.free=false;
  86.                         mother.interrupt();
  87.                         son.interrupt();
  88.                 }
  89.         }
  90.         
  91.         /**
  92.          * Test
  93.          */
  94.         public static void main(String[] args) throws Exception {
  95.                 Home home = new Home();
  96.                 home.startCooking();
  97.                 Thread.sleep(15000);
  98.                 home.stopCooking();
  99.         }

  100. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
其实就是一个多线程同步的问题,执行权的释放以及唤醒,你去参考一下生产者消费者问题,其实你这个题目就用那个模版就行了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马