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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class resource_1{
        String name;
        String sex;
        boolean b=false;
}
class input_1 implements Runnable{
        resource_1 r;
         input_1(resource_1 r){
                 this.r=r;
         }
         public void run(){
                 int x=0;
                 while(true){
                         synchronized(r){
                                 if(r.b){
                                         try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                         if(x==0){
                                                 r.name="丽丽";
                                                 r.sex="女";
                                         }else{
                                                 r.name="旺财";
                                                 r.sex="男";
                                         }
                                 }
                                 r.b=true;
                                 r.notify();
                         }
                         x=(x+1)%2;
                 }
               
         }
       
}
class output_1 implements Runnable{
        resource_1 r;
        output_1(resource_1 r){
                this.r=r;
        }
        public void run(){
                while(true){
                        synchronized(r){
                                if(!r.b){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(r.name+"....."+r.sex);
                                }
                                r.b=false;
                                r.notify();
                        }
                }
        }
}
public class 等待唤醒机制 {
                public static void main(String[] args){
                        resource_1 r=new resource_1();
                        input_1 in=new input_1(r);
                        output_1 out=new output_1(r);
                        Thread t=new Thread(in);
                        Thread t1=new Thread(out);
                        t.start();
                        t1.start();
                }

}

2 个回复

倒序浏览

class resource_1{
        String name;
        String sex;
        boolean b=false;
}
class input_1 implements Runnable{
        resource_1 r;
         input_1(resource_1 r){
                 this.r=r;
         }
         public void run(){
                 int x=0;
                 while(true){
                         synchronized(r){
                                 if(r.b){
                                         try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                         if(x==0){
                                                 r.name="丽丽";
                                                 r.sex="女";
                                         }else{
                                                 r.name="旺财";
                                                 r.sex="男";
                                         }
                                 }
                                 /*这里不能这么写,上面的if语句不能把
                                                  if(x==0){
                                                      r.name="丽丽";
                                                 r.sex="女";
                                         }else{
                                                 r.name="旺财";
                                                 r.sex="男";
                                这句包含起来,包含起来第一次就执行不到了,无法进行赋值,如果像下面那样
                                加上sleep语句,就会看到打印的是null值;你可以更改sleep参数试一下,
                                */
                                 r.b=true;
                                 r.notify();
                         }
                         try {
                                                        Thread.sleep(10);
                                                } catch (InterruptedException e) {
                                                        // TODO 自动生成的 catch 块
                                                        e.printStackTrace();
                         x=(x+1)%2;//这句用该放到同步代码快中,如果放在这里,前面加上sleep语句你会看到属性都是连续打印的。
                 }
               
         }
        
}
class output_1 implements Runnable{
        resource_1 r;
        output_1(resource_1 r){
                this.r=r;
        }
        public void run(){
                while(true){
                        synchronized(r){
                                if(!r.b){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(r.name+"....."+r.sex);
                                }
                                r.b=false;
                                r.notify();
                        }
                }
        }
}
public class 等待唤醒机制 {
    public static void main(String[] args){
            resource_1 r=new resource_1();
            input_1 in=new input_1(r);
            output_1 out=new output_1(r);
            Thread t=new Thread(in);
            Thread t1=new Thread(out);
            t.start();
            t1.start();
    }

}
下面贴出我修改过的
回复 使用道具 举报
      
class resource_1{
        String name;
        String sex;
        boolean b=false;
}
class input_1 implements Runnable{
        resource_1 r;
         input_1(resource_1 r){
                 this.r=r;
         }
         public void run(){
                 int x=0;
                 while(true){
                         synchronized(r){
                                 if(r.b)
                                 {
                                         try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                  }
                                   if(x==0){
                                         r.name="丽丽";
                                           r.sex="女";
                                   }else{
                                        r.name="旺财";
                                        r.sex="男";
                                  }
                                 
                                 r.b=true;
                                 r.notify();
                                 x=(x+1)%2;
                         }
                     
                 }
               
         }
        
}
class output_1 implements Runnable{
        resource_1 r;
        output_1(resource_1 r){
                this.r=r;
        }
        public void run(){
                while(true){
                        synchronized(r){
                                if(!r.b){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(r.name+"....."+r.sex);
                                }
                                r.b=false;
                                r.notify();
                        }
                }
        }
}
public class Duo1 {
                public static void main(String[] args){
                        resource_1 r=new resource_1();
                        input_1 in=new input_1(r);
                        output_1 out=new output_1(r);
                        Thread t=new Thread(in);
                        Thread t1=new Thread(out);
                        t.start();
                        t1.start();
                }

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马