黑马程序员技术交流社区

标题: 多线程中wait和notify问题 [打印本页]

作者: 右眼会动的人    时间: 2012-7-18 16:07
标题: 多线程中wait和notify问题
        public synchronized void set(String name,String sex){
                if(falg){
                        try{
                        this.wait();
                        }catch(Exception e){}
                this.name=name;
                this.sex=sex;
                falg=true;
                this.notify();
                }
        }
        public synchronized void run(){
                if(!falg){
                        try{
                        this.wait();
                        }catch(Exception e){}
                System.out.println(name+"............."+sex);
                falg=false;
                this.notify();
                }
        }

public synchronized void set(String name,String sex)
        {
                if(flag)
                        try{
                                this.wait();
                                }catch(Exception e)
                                {}
                this.name = name;
               
                this.sex = sex;
                flag = true;
                this.notify();
        }
       
        public synchronized void out()
        {
                if(!flag)
                        try{this.wait();}catch(Exception e){}
                System.out.println(name+"........"+sex);
                flag = false;
                this.notify();
        }
有什么区别,为什么老师在eclipse中可以运行,最上面一个却不行,求解答

作者: 邓超军    时间: 2012-7-18 17:28
原因在于第一个中set把所有代码放在了if语句块中,线程遇到了try语句,进行了wait,不能执行后面的语句,造成了死锁。其中有一个知识点,希望对你有帮助:
if(flag)中的flag的值永远为true,if(!flag)中的flag的值永远为false,与if语句块外面的flag值无关;或者说可以这样理解:if(flag)等同于if(flag==true),if(!flag)等同于if(flag==false)。
作者: 邓超军    时间: 2012-7-18 17:29
原因在于第一个中set把所有代码放在了if语句块中,线程遇到了try语句,进行了wait,不能执行后面的语句,造成了死锁。其中有一个知识点,希望对你有帮助:
if(flag)中的flag的值永远为true,if(!flag)中的flag的值永远为false,与if语句块外面的flag值无关;或者说可以这样理解:if(flag)等同于if(flag==true),if(!flag)等同于if(flag==false)。
作者: 鲍霄霄    时间: 2012-7-18 20:29
  1. 如果你觉得我没加对的话,你可以把信息整全一点

  2. package pack1;

  3. public class ClassD {

  4.       boolean falg;

  5.      public String name;

  6.      public String sex;

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

  8.           ClassD d = new ClassD();

  9.           d.set("asdas", "aaaa");

  10.           d.run();

  11.       }

  12.       public synchronized void set(String name,String sex){

  13.             if(falg)<FONT color=red>{</FONT>     //falg默认是false,即if后面的括号里是false,所以到这一步就会跳过,因为代码都是被括在if后面的大括号里
  14.                            //所以就直接跳出了此方法,然后开始运行方法run()
  15.               try<FONT color=black>{
  16. </FONT>
  17.                   this.wait();

  18.              }catch(Exception e){

  19.              }

  20.              this.name=name;

  21.              this.sex=sex;

  22.              falg=true;

  23.              this.notify();

  24. <FONT color=red>         }
  25. </FONT>
  26.     }

  27.     public synchronized void run(){

  28.           if(!falg){ //由于falg默认的是false,所以!falg = true,所以到这里后会进入大括号

  29.           try{ //首先进去try里

  30.                  this.wait(); //不好意思,执行这一行代码,就会死这了

  31.           }catch(Exception e){

  32.           }

  33.          //由于上面在执行this.wait();时死那了,所以下面的也就不会继续执行。
  34.          System.out.println(name+"............."+sex);

  35.          falg=false;

  36.          this.notify();

  37.       }

  38.     }

  39. }
复制代码

作者: 右眼会动的人    时间: 2012-7-19 14:12
鲍霄霄 发表于 2012-7-18 20:29

谢谢,问题已解决
作者: 右眼会动的人    时间: 2012-7-19 14:12
邓超军 发表于 2012-7-18 17:28
原因在于第一个中set把所有代码放在了if语句块中,线程遇到了try语句,进行了wait,不能执行后面的语句,造 ...

谢谢指点
作者: 鲍霄霄    时间: 2012-7-19 14:17
不客气的啦




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