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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘松老师 高级黑马   /  2013-3-12 21:33  /  1284 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写的等待唤醒机制为什么什么也没输出?不解....
package com.thread;
public class DoubleRunnable {
       public static void main(String[] args) {
         Person p = new Person();
         new Thread(new Input(p)).start();
         new Thread(new OutPut(p)).start();
    }
}
class Input implements Runnable
{   
       private Person p;
       Input(Person p){
           this.p=p;
       }
    public void run(){
           boolean b = true;
           while(true){
               if(b=true){
                  p.set("zhangsan", "nan");
                   b=false;
               }else{
                   p.set("小小", "女");
                   b=true;      
          }
       }
    }
}
class OutPut implements Runnable
{   
    private Person p;
    OutPut(Person p){
        this.p=p;
    }
    public void run(){
        while(true){
            p.out();
        }
    }
   
}

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



评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 王智威 于 2013-3-12 22:06 编辑

你在睡下去子前要叫交醒别人,而不是睡了再交醒别人。

下面是我该过的代码:

public class DoubleRunnable {
        public static void main(String[] args) {
          Person p = new Person();
          new Thread(new Input(p)).start();
          new Thread(){
           
          };
          new Thread(new OutPut(p)).start();
      }
}
class Input implements Runnable
{   
       private Person p;
        Input(Person p){
            this.p=p;
        }
     public void run(){
      
            boolean b = true;
            while(true){
                if(b){
                   p.set("zhangsan", "nan");
                    b=false;
                }else{
                    p.set("小小", "女");
                    b=true;      
          }
        }
     }
}
class OutPut implements Runnable
{   
     private Person p;
     OutPut(Person p){
         this.p=p;
     }
     public void run(){
         while(true){
             p.out();
         }
     }
     
}

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

下面是运行结果:
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan
小小==女
zhangsan==nan

希望是你想要的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
两处错误:第一
  1.         if(flag){
  2.             try {
  3.                 this.wait();
  4.             } catch (InterruptedException e) {
  5.                 e.printStackTrace();
  6.             }
  7.         this.name=name;
  8.         this.sex=sex;
  9.         flag=true;
  10.         this.notify();
  11.        }                     //你这个if的括号有点远,它是用来判断该线程是否等待,把后面都括起来,改变标志位和唤醒线程都执行不到了
  12.     }
复制代码
第二个:是个低级错误
  1. if(b=true){            //判断不是赋值 if(b==true)
  2.                   p.set("zhangsan", "nan");
  3.                    b=false;
  4.                }else{
  5.                    p.set("小小", "女");
  6.                    b=true;      
  7.           }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
孙晋学 发表于 2013-3-12 22:50
两处错误:第一第二个:是个低级错误

哦,原来如此,谢谢啦
回复 使用道具 举报
如果仍有问题,可以继续追问;若没有问题了,请及时将帖子分类改成【已解决】~

http://bbs.itheima.com/thread-37643-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马