黑马程序员技术交流社区

标题: 关于线程通讯的一个小程序 [打印本页]

作者: 王春晓    时间: 2013-5-14 19:58
标题: 关于线程通讯的一个小程序
本帖最后由 王春晓 于 2013-5-14 21:11 编辑
  1. class InputOutputDemo {
  2.         public static void main(String[] args){
  3.                 Res s = new Res();
  4.                 Input in = new Input(s);
  5.                 Output out = new Output(s);
  6.                 Thread t1 = new Thread(in);
  7.                 Thread t2 = new Thread(out);
  8.                 t1.start();
  9.                 t2.start();
  10.         }
  11. }

  12. class Input implements Runnable{
  13.         private Res s;
  14.         Input(Res s){
  15.                 this.s = s;
  16.         }
  17.         public void run(){
  18.                 boolean flag = true;
  19.                 while(true){
  20.                         synchronized (s) {
  21.                                 if(s.x==1)
  22.                                         try {
  23.                                                 wait();
  24.                                         } catch (InterruptedException e) {
  25.                                                 // TODO Auto-generated catch block
  26.                                                 e.printStackTrace();
  27.                                         }
  28.                                 if(flag){
  29.                                         s.setName("zhangsan");
  30.                                         s.setSex("nan");
  31.                                         flag = false;
  32.                                 }else{
  33.                                         s.setName("李四");
  34.                                         s.setSex("女");
  35.                                         flag = true;
  36.                                 }
  37.                                 s.x = 1;
  38.                                 notify();
  39.                         }
  40.                 }
  41.         }
  42. }

  43. class Output implements Runnable{
  44.         private Res s;
  45.         Output(Res s){
  46.                 this.s = s;
  47.         }
  48.         public void run(){
  49.                 while(true){
  50.                         synchronized (s) {
  51.                                 if(s.x==0)
  52.                                         try {
  53.                                                 wait();
  54.                                         } catch (InterruptedException e) {
  55.                                                 // TODO Auto-generated catch block
  56.                                                 e.printStackTrace();
  57.                                         }
  58.                                 System.out.println(s.getName()+s.getSex());
  59.                                 s.x=0;
  60.                                 notify();
  61.                         }
  62.                 }
  63.         }
  64. }

  65. class Res{
  66.         int x = 0;
  67.         private String name;
  68.         private String sex;
  69.         public String getName() {
  70.                 return name;
  71.         }
  72.         public void setName(String name) {
  73.                 this.name = name;
  74.         }
  75.         public String getSex() {
  76.                 return sex;
  77.         }
  78.         public void setSex(String sex) {
  79.                 this.sex = sex;
  80.         }
  81. }
复制代码
这是根据线程通讯章节写的一个Demo,运行报异常,求解释!



作者: 乎¤_¤乎    时间: 2013-5-14 20:39
我对这一块一直很头疼,躲了好几天了,为了老兄,我再痛苦痛苦吧,呼呼
作者: 乎¤_¤乎    时间: 2013-5-14 21:06
在wait()和notify()前面要加上s.
作者: xuemeng    时间: 2013-5-14 21:07
本帖最后由 xuemeng 于 2013-5-14 21:09 编辑

class Demo {
        public static void main(String[] args) {
                Res s = new Res();
                Input in = new Input(s);
                Output out = new Output(s);
                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);
                t1.start();
                t2.start();
        }
}

class Input implements Runnable {
        private Res s;

        Input(Res s) {
                this.s = s;
        }

        public void run() {

                boolean flag = true;

                while (true) {
                        synchronized (s) {
                                if (s.x == 1)
                                        try {
                                                s.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                if (flag) {
                                        s.setName("zhangsan");
                                        s.setSex("nan");
                                        flag = false;
                                } else {
                                        s.setName("李四");
                                        s.setSex("女");
                                        flag = true;
                                }
                                s.x = 1;
                                s.notify();
                        }
                }
        }
}

class Output implements Runnable {
        private Res s;

        Output(Res s) {
                this.s = s;
        }

        public void run() {
                while (true) {
                        synchronized (s) {
                                if (!(s.x == 1))
                                        try {
                                                s.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                System.out.println(s.getName() + s.getSex());
                                s.x = 0;
                                s.notify();
                        }
                }
        }
}

class Res {
        int x = 0;
        private String name;
        private String sex;

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public String getSex() {
                return sex;
        }

        public void setSex(String sex) {
                this.sex = sex;
        }
}
通讯方法必须用监视器对象来调用才对, 你的监视器对象是  s, 我就用s 对象来调用  wait() 和notify()方法, 这样代码就没问题了




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