黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 官文昌    时间: 2012-8-20 16:42
标题: 多线程问题
public class Input_OutputDemo2 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Res r=new Res();       
                new Thread(new Input(r)).start();
                new Thread(new Output(r)).start();
               
               
        }

}


class Res
{
        private String name;
        private String sex;
        private boolean flag=false;
        synchronized public void set(String name,String sex)
        {
                if(flag)
                        try {this.wait();}        catch (InterruptedException e) {}
                                                                        //       else{
                this.name = name;                           //                 this.name = name;
                this.sex = sex;                                       //                  this.sex = sex;       
                flag=true;                                        //                 flag=true;
                this.notify();                                     //                 this.notify();
                                                                       //                 
               
        }
       
        synchronized public void out()
        {
                if(!flag)
                        try {this.wait();} catch (InterruptedException e) {}
                                                                                                  //   else{
                        System.out.println(name+"-----"+sex);              //          System.out.println(name+"-----"+sex);
                        flag=false;                                                         //             flag=false;
                        this.notify();                                                       //             this.notify();
                                                                                                  //            
                                                                                                              
        }
}

class Input implements Runnable
{
        private Res r;
        public Input(Res r)
        {
                this.r=r;
        }
        public void run()
        {       
                int j=0;
                for(int i=1;i<50;i++)
                {
                                if(j==0)
                                {
                                        r.set("mike", "man");
                                }else
                                {
                                        r.set("丽丽", "女女");
                                }
                        j=(j+1)%2;
                }
        }
}

class Output implements Runnable
{

        private Res r;
        public Output(Res r)
        {
                this.r=r;
        }
        public void run()
        {
                for(int i=1;i<50;i++)
                {
                        r.out();
            }
        }
       
}


在上面代码中我把蓝色的换成红色的,为啥结果截然不同呢??flag为假时不是就是执行它下面的部分吗??

作者: 王德升    时间: 2012-8-20 17:51
public class Input_OutputDemo2 {

        /**
          * @param args
          */
         public static void main(String[] args) {
                 // TODO Auto-generated method stub
                 Res r=new Res();        
                new Thread(new Input(r)).start();
                 new Thread(new Output(r)).start();
                 
               
        }

}


class Res
{
         private String name;
         private String sex;
         private boolean flag=false;
         synchronized public void set(String name,String sex)
        {
                 if(flag)
                         try {this.wait();}        catch (InterruptedException e) {}
                                                                         //       else{ //你这里加了else,当flag为false时候就会读到else里面的内容,当没有else的时候,else为true时jvm读完try catch之后会继续往下读,当flag为false的时候就会不读if后面的一条句子(如果你没有加大括号,如果你加了就全部读完再往下面读)而往下面读。。
                 this.name = name;                           //                 this.name = name;
                 this.sex = sex;                                       //                  this.sex = sex;        
                flag=true;                                        //                 flag=true;
                 this.notify();                                     //                 this.notify();
                                                                        //                 }
                 
        }
         
        synchronized public void out()
         {
                 if(!flag)
                         try {this.wait();} catch (InterruptedException e) {}
                                                                                                   //   else{//这里和上面的是一样的。
                         System.out.println(name+"-----"+sex);              //          System.out.println(name+"-----"+sex);
                         flag=false;                                                         //             flag=false;
                         this.notify();                                                       //             this.notify();
                                                                                                   //            }
                                                                                                               
         }
}

class Input implements Runnable
{
         private Res r;
         public Input(Res r)
         {
                 this.r=r;
         }
         public void run()
        {        
                int j=0;
                 for(int i=1;i<50;i++)
                 {
                                 if(j==0)
                                 {
                                         r.set("mike", "man");
                                 }else
                                 {
                                         r.set("丽丽", "女女");
                                 }
                         j=(j+1)%2;
                 }
         }
}

class Output implements Runnable
{

        private Res r;
         public Output(Res r)
         {
                 this.r=r;
         }
         public void run()
        {
                 for(int i=1;i<50;i++)
                 {
                         r.out();
             }
         }
         
}


//看下面的例子。
class Test
{

        public static void main(String[] args)
        {
                print(false);
        }

        public static void print(boolean flag)
        {
               
                if(flag)
               
                        System.out.println("我是if里面的");
               

                 //else

                        System.out.println("我是else里面的");
                               
                //这里有没有else是一样的。
        }
}
*/

class Test
{

        public static void main(String[] args)
        {
                print(true);
        }

        public static void print(boolean flag)
        {
               
                if(flag)
               
                        System.out.println("我是if里面的");
               

                 //else

                        System.out.println("我是else里面的");

                        System.out.println("我不属于if和else");
                               
                //这里就有区别了3句话都可以执行到。
        }
}
*/

作者: 李知伦    时间: 2012-8-20 18:27
if后面语句没加大括号,只能支配下一行的语句,导致蓝色部分始终会执行

但是红色部分放在了else里,只有当flag为false时,才会执行
作者: 官文昌    时间: 2012-8-21 00:25
王德升 发表于 2012-8-20 17:51
public class Input_OutputDemo2 {

        /**

非常感谢~~
作者: 官文昌    时间: 2012-8-21 00:26
李知伦 发表于 2012-8-20 18:27
if后面语句没加大括号,只能支配下一行的语句,导致蓝色部分始终会执行

但是红色部分放在了else里,只有当fla ...

非常感谢~~




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