黑马程序员技术交流社区

标题: 关于线程间通信思考的一些问题 [打印本页]

作者: 朱晓杰    时间: 2013-4-16 21:56
标题: 关于线程间通信思考的一些问题
本帖最后由 朱晓杰 于 2013-4-17 17:07 编辑

这些天刚刚跟着毕老师窥探了一下多线程这个神秘的世界,自己动手编写了入学基础测试题的第十题(妈妈做饭的代码),运行结果正常,可是还有一些困惑,下面贴上我的代码:
package com.itheima;

public class Test10 {
        /**
         *第10题:模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
         *
         * @author zhuxiaojie
         */
          public static void main(String[] args){
                  Salt salt = new Salt();
                  
                  Mother m = new Mother(salt);
                  Son s = new Son(salt);
                  
                  Thread mother = new Thread(m);
                  Thread son = new Thread(s);
                  
                  mother.start();
                  son.start();

                  //mother.setPriority(5);                  //mother.setPriority(1);
          }
}

//共享资源:盐类
class Salt{
        boolean flag = false;
}

//妈妈类
class Mother implements Runnable{
        private Salt salt;
        
        public Mother(Salt salt){
                this.salt = salt;
        }
        
        public void run() {
                while(true){
                        synchronized(salt){
                                if(!salt.flag){
                                        System.out.println("Mother:儿子,没有盐了,你去买盐吧!");
                                        salt.notify();//唤醒儿子去买盐
                                        try {
                                                salt.wait();//等待儿子把盐买回来
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }else{
                                        System.out.println("Mother:做饭中...儿子,待会就能吃饭了!");
                                        System.out.println();
                                        try {
                                                Thread.sleep(1*60*1000);//做饭需要时间
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        salt.flag = false;//改变盐的状态:没盐
                                }
                        }
                }
        }
}

//儿子类
class Son implements Runnable{
        private Salt salt;
        
        public Son(Salt salt){
                this.salt = salt;
        }
        
        public void run() {
                while(true){
                        synchronized(salt){
                                if(!salt.flag){
                                        System.out.println("Son:妈妈,你等会,我现在就去买盐!");
                                        try {
                                                Thread.sleep(3*60*1000);//买盐需要三分钟
                                                salt.flag = true;//改变盐的状态:有盐
                                                System.out.println("Son:妈妈,盐买回来了,什么是否能吃饭啊?");
                                                salt.notify();//唤醒妈妈继续做饭
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                try {
                                        salt.wait();//等待吃饭
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }
}


困惑一:怎么才能让儿子吃上饭呢?每次儿子买回盐来之后,就又得去买盐!
困惑二:程序运行结果的第一次 总是儿子先去买盐,可是我想让妈妈先执行,后来我想到了设置线程的优先级,但是不管用,请问该怎么处理?线程的优先级什么时候使用?数字越大代表优先级越高?
困惑三:根据题目的需求,我的代码还能怎么优化呢?请各位多多指教!谢谢!

作者: 何俊森    时间: 2013-4-17 11:17
本帖最后由 何俊森 于 2013-4-17 15:00 编辑

题目的意思 是模拟做饭的过程。lz的代码运行结果是一直 在买盐,做饭。

作者: 黑马-郑玉元    时间: 2013-4-17 11:36
鼓励一下!!!
作者: 朱晓杰    时间: 2013-4-17 13:29
何俊森 发表于 2013-4-17 11:17
题目的意思 是模拟做饭的过程。lz的代码运行结果是一直 在买盐,做饭。
  • “困惑一:怎么才能让儿子吃上 ...

  • 作者的Salt类并没有什么实际用途啊?
    作者: 何俊森    时间: 2013-4-17 14:32
    朱晓杰 发表于 2013-4-17 13:29
    作者的Salt类并没有什么实际用途啊?

    对,那个忘删了。我那个没有想那么复杂,基本适合题目的意思。
    作者: 朱晓杰    时间: 2013-4-17 17:01
    何俊森 发表于 2013-4-17 14:32
    对,那个忘删了。我那个没有想那么复杂,基本适合题目的意思。

    恩恩,是了,我仔细分析了你的代码,挺简单的,只是我现在多线程只学习了一半,线程间的通信还没有完全掌握呢,谢谢你的回答,感觉自己对多线程的理解有加强了!




    欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2