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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁錦泰 黑马帝   /  2012-5-29 00:48  /  2009 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁錦泰 于 2012-5-29 10:42 编辑
  1. class Res {
  2.         private String name;
  3.         private String gender;
  4.         private boolean flag;

  5.         public synchronized void set(String name, String gender) {
  6.                 if (this.flag) {
  7.                         try {
  8.                                 this.wait();
  9.                         } catch (InterruptedException e) {
  10.                                 e.printStackTrace();
  11.                         }
  12.                 } else {
  13.                         this.name = name;
  14.                         this.gender = gender;
  15.                 }
  16.                 this.flag = true;
  17.                 this.notify();
  18.         }

  19.         public synchronized void out() {
  20.                 if (!this.flag) {
  21.                         try {
  22.                                 this.wait();
  23.                         } catch (InterruptedException e) {
  24.                                 e.printStackTrace();
  25.                         }
  26.                 } else {
  27.                         System.out.println(this.name + "," + this.gender);
  28.                 }
  29.                 this.flag = false;
  30.                 this.notify();
  31.         }

  32. }

  33. class Input implements Runnable {
  34.         private Res r;

  35.         Input(Res r) {
  36.                 this.r = r;
  37.         }

  38.         public void run() {
  39.                 int x = 0;
  40.                 while (true) {
  41.                         if (x == 0) {
  42.                                 r.set("zhangsan", "male");
  43.                         } else {
  44.                                 r.set("lisi", "female");
  45.                         }
  46.                         x = (x + 1) % 2;
  47.                 }
  48.         }
  49. }

  50. class Output implements Runnable {
  51.         private Res r;

  52.         Output(Res r) {
  53.                 this.r = r;
  54.         }

  55.         public void run() {
  56.                 while (true) {
  57.                         r.out();
  58.                 }
  59.         }
  60. }

  61. public class InputOutputDemo {

  62.         public static void main(String[] args) {

  63.                 Res r = new Res();
  64.                 new Thread(new Input(r)).start();
  65.                 new Thread(new Output(r)).start();
  66.         }

  67. }
复制代码
部分结果为:
  1. zhangsan,male
  2. zhangsan,male
  3. zhangsan,male
  4. zhangsan,male
  5. zhangsan,male
  6. lisi,female
  7. lisi,female
  8. lisi,female
  9. lisi,female
  10. lisi,female
  11. zhangsan,male
  12. zhangsan,male
复制代码
复习之前所学,我看了许久找不到问题所在,为何出书结果是批量输出,而不是有顺序的分别逐个输出.
请各位细心人帮忙分析一下哪里有错误.

4 个回复

正序浏览
本帖最后由 黄奕豪 于 2012-5-29 02:08 编辑

楼主的代码格式真的挺看不惯的,所以调整了一下!
class Res
        {
        private String name;
        private String gender;
        private boolean flag = false;
        public synchronized void  set(String name, String gender)
                {
                                if (flag)
                                {
                                        try {
                                                        wait();
                                                }
                                        catch (InterruptedException e)
                                        {
                                                  e.printStackTrace();
                                        }
                                 }
                               //else去掉,下面的一样,这里加上else的话他跟上面的if是一体的,如果线程执行了if,就不会执行else,当线程返回时,判断flag = true,进入等待,唤醒的时候因为已经判断过if了,所以不执行else里面的代码,直接跳过了赋值~~~
                                this.name = name;
                                this.gender = gender;  
                                flag = true;
                                notify();
        }

        public synchronized void out()
                {
                                if (!flag)
                                {
                                        try
                                        {
                                                wait();
                                        }
                                        catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }         
                                }
                                System.out.println(this.name + "," + this.gender);
                                flag = false;//
         
                                notify();
                        }
}

class Input implements Runnable {

        private Res r;
        Input(Res r)
                {
                        this.r = r;
        }
        public void run()                        
                {
            int x = 0;
            while (true)
                        {
                if (x == 0)
                                {
                      r.set("zhangsan", "male");
                }
                                else
                                {
                                        r.set("lisi", "female");
                }
                x = (x + 1) % 2;
                        }
        }
}


class Output implements Runnable
        {
        private Res r;
        Output(Res r)
                {
                        this.r = r;
        }
        public void run()
                {
            while (true)
                        {
                r.out();               
                        }
        }
}


public class InputOutputDemo {


        public static void main(String[] args) {


                Res r = new Res();

                new Thread(new Input(r)).start();

                new Thread(new Output(r)).start();

        }


}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你的set函数里不能写else语句,把else删除(里面的代码还是要的,只是不加else)。如果有else的话执行一次if线程等待,被唤醒后直接执行else后的语句而不会执行else里的语句,因为if和else只能执行一个。
回复 使用道具 举报
本帖最后由 罗文杰 于 2012-5-29 09:09 编辑

{:soso_e136:}原来写的理解错了,看了楼下了解到原来是else方法体的问题- -~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马