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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁俊 黑马帝   /  2013-1-16 15:58  /  2976 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-19 12:48 编辑

模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
class Mather{
    public void zuoFan(){
        System.out.println("做饭发现没盐了");
        new Son().start();
        System.out.println("继续做饭");
    }
}
class Son extends Thread{
    public void run(){
        Thread.sleep(3000);
    }
}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

12 个回复

正序浏览
yong230 发表于 2013-1-16 17:19
楼主的 Thread.sleep(3000);这句不对吧,是以毫秒为单位的,休眠三分钟应该是Thread.sleep(3*60*1000); ...

是啊是啊,这点没注意到。
回复 使用道具 举报
本帖最后由 zyx67786110 于 2013-1-20 10:39 编辑
  1. ackage com.itheima;
  2. import java.lang.*;
  3. /**
  4. *
  5. * 第10题、 模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),
  6. * 只有盐买回来之后,妈妈才能继续做饭的过程。
  7. *  */

  8. public class Test10
  9. {
  10.         /*
  11.          这其实是线程间的通讯问题。盐是两个线程都需要操作的对象,建立独立的类,通过两个线程的构造函数传递进去
  12.          */
  13.         public static void main(String[] args) {
  14.                 // TODO Auto-generated method stub
  15.                 Resource re =  new Resource();
  16.                 new Thread(new Mum(re)).start();
  17.                 new Thread(new Son(re)).start();


  18.         }

  19. }
  20. class Mum implements Runnable
  21. {
  22.         private Resource s ;
  23.         Mum(Resource s)
  24.         {
  25.                 this.s = s;
  26.         }

  27.         @Override
  28.         public void run()
  29.         {
  30.                 // TODO Auto-generated method stub
  31.                 //模拟两次
  32.                 int x = 2;
  33.                 while(x>0)
  34.                 {
  35.                         s.useSalt();
  36.                         x--;
  37.                 }
  38.                
  39.         }        
  40.         
  41. }

  42. class Son implements Runnable
  43. {
  44.         private Resource s ;
  45.         Son(Resource s)
  46.         {
  47.                 this.s = s;
  48.         }

  49.         @Override
  50.         public void run()
  51.         {
  52.                 // TODO Auto-generated method stub
  53.                 //模拟两次
  54.                 int x = 2;
  55.                 while(x>0)
  56.                 {
  57.                         s.buySalt();
  58.                         x--;
  59.                 }
  60.         }
  61.         
  62. }
  63. class Resource
  64. {        
  65.         //定义标记。
  66.         public boolean hasSalt = false;
  67.         public synchronized void useSalt()
  68.         {        
  69.                 if(!hasSalt)
  70.                         try
  71.                         {
  72.                                 System.out.println("Mum:there is no salt,buy some ,son");
  73.                                 wait();                                 
  74.                         }
  75.                         catch(Exception e)
  76.                         {
  77.                         }
  78.                         System.out.println("Mum: I am cooking now------------");
  79.                         hasSalt = false;
  80.                         notifyAll();

  81.                
  82.                
  83.         }
  84.         public synchronized void buySalt()
  85.         {        
  86.                 if(hasSalt)
  87.                         try
  88.                         {                                
  89.                                 wait();
  90.                         }
  91.                         catch(Exception e)
  92.                         {
  93.                         }
  94.                
  95.                 System.out.println("Son: I will go to buy some salt;");
  96.                
  97.                 try
  98.                 {
  99.                         Thread.currentThread().sleep(3*60*1000);
  100.                 }
  101.                
  102.                 catch (Exception e)
  103.                 {
  104.                 }
  105.                 System.out.println("Son: I have bought som salt,Mum -----");
  106.                 hasSalt = true;
  107.                 notifyAll();
  108.                
  109.         }
  110.         
  111. }
复制代码
哈哈,这是黑马基础测试题吧。我是这样答的。这里用到了专家模式(谁拥有资源,操作该资源的方法就归给谁。),因为盐单独成为一个类,所以操作盐的方法也封转到了盐(Res)这个资源类中。
回复 使用道具 举报
楼主,你没发现你的代码运行结果是盐还没买回来,反已经继续做了啊,其实按照你说的要等儿子买盐回来在继续做饭,就是单线程,想药多线程的话,就应该让儿子去买盐,然后妈妈先做别的,等儿子买盐回来,在继续做饭。
class Mather{
    public void zuoFan(){
        System.out.println("做饭发现没盐了");
        new Son().start();
       System.out.println("做其它的,儿子买盐回来在继续做饭");
        
            }
}
class Son extends Thread{
    public void run(){
        Thread.sleep(180000);
       System.out.println("买盐归来,喊妈妈继续做饭");

    }
}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张向辉 于 2013-1-17 15:59 编辑

我不认为这是考多线程的问题   我觉得它主要是考对JAVA对象的认识
我是这么解决的:
package lianxi;

public class Demozuofan {

        /**
         * @param args
         * 模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
         * @throws Exception

         */
        public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
                //new Son().maiyan();
                new Mather().zuofan();
        }
        
}

class YanGuan
{
        private static int yan;

        public static int getYan() {
                return yan;
        }

        public static void setYan(int yan) {
                YanGuan.yan = yan;
        }
         
}
class Mather
{
        int yan = YanGuan.getYan();
        public void zuofan() throws Exception
        {
                while(yan==0)
                {
                        System.out.println("盐罐没盐了,儿子去买盐!");
                        new Son().maiyan();
                        yan = YanGuan.getYan();
                }
                System.out.println("妈妈做饭中...");
        }
}
class Son
{
        public void maiyan() throws InterruptedException
        {
                System.out.println("儿子买盐用了三分钟");
                YanGuan.setYan(10);
        }
}
只有盐买回来之后,妈妈才能继续做饭的过程  对于这句的理解:可以让线程停下 ,上面没有做  我用了输出语句表示 上面有while循环,只有有盐的情况下做饭才能接续
回复 使用道具 举报
皇冠黑马哎 得注册多长时间了啊  哈哈
回复 使用道具 举报
王阳 中级黑马 2013-1-16 22:45:38
8#
这个貌似是基础测试题吧,我做过一回,楼主最好这样以做饭为一个类来实现,其中有做饭和买盐两个方法,而有一个成员属性是boolean值,就是是否有盐,这样以盐是否有为监视器对象,同步两个方法就没问题了,再分别实现妈妈和儿子两个类,并且都实现Runnable,然后在run方法里分别调用买盐和做饭的方法,这样就比较妥当了。
回复 使用道具 举报
楼主的 Thread.sleep(3000);这句不对吧,是以毫秒为单位的,休眠三分钟应该是Thread.sleep(3*60*1000);
回复 使用道具 举报
题目出的是不太严谨,其实题目就是想考一下Thread.sleep()方法的使用而已
我的答案:
public class Test10 {
        public static void main(String[] args) {
                cook();
                System.out.println("做完饭了.....");
        }

        /*
         * 做饭
         */
        public static void cook() {
                System.out.println("妈妈开始做饭发现没盐了,让儿子去买盐.........");
                buySalt();
                System.out.println("妈妈继续做饭了.....");
               
        }
        /*
         * 买盐
         */
        public static void buySalt() {
                System.out.println("儿子去买盐了.....");
                try {
                        Thread.sleep(3*60*1000);//使当前线程休眠3分钟模拟买盐需要3分钟
                } catch (InterruptedException e) {
                        e.printStackTrace();
                        return;
                }
                System.out.println("儿子买盐回来了,妈妈继续做饭.....");
        }

}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
王溢君 来自手机 中级黑马 2013-1-16 16:40:41
报纸
把你的代码写完整吧。
回复 使用道具 举报
改成妈妈知道盐没有了,做饭之前叫儿子去买盐 她去做菜  比较符合多线程的意义
回复 使用道具 举报
这个题目跟本不符合多线程的意义
回复 使用道具 举报
这个比法有趣,但是不贴切。
1.如果妈妈要等盐买回来才可以做饭。那么买盐这段时间妈妈什么事都不做。这样,是单线程。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马