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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 右眼会动的人 初级黑马   /  2012-7-18 16:07  /  1880 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        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中可以运行,最上面一个却不行,求解答

6 个回复

倒序浏览
原因在于第一个中set把所有代码放在了if语句块中,线程遇到了try语句,进行了wait,不能执行后面的语句,造成了死锁。其中有一个知识点,希望对你有帮助:
if(flag)中的flag的值永远为true,if(!flag)中的flag的值永远为false,与if语句块外面的flag值无关;或者说可以这样理解:if(flag)等同于if(flag==true),if(!flag)等同于if(flag==false)。
回复 使用道具 举报
原因在于第一个中set把所有代码放在了if语句块中,线程遇到了try语句,进行了wait,不能执行后面的语句,造成了死锁。其中有一个知识点,希望对你有帮助:
if(flag)中的flag的值永远为true,if(!flag)中的flag的值永远为false,与if语句块外面的flag值无关;或者说可以这样理解:if(flag)等同于if(flag==true),if(!flag)等同于if(flag==false)。
回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
鲍霄霄 发表于 2012-7-18 20:29

谢谢,问题已解决
回复 使用道具 举报
邓超军 发表于 2012-7-18 17:28
原因在于第一个中set把所有代码放在了if语句块中,线程遇到了try语句,进行了wait,不能执行后面的语句,造 ...

谢谢指点
回复 使用道具 举报
不客气的啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马