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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zdf091119 中级黑马   /  2012-10-28 20:26  /  1905 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Noname1{
  public static void main(String arg[]){
                Value v=new Value();
         //   new Thread(new Inter(v)).start();
    //   new Thread(new Puter(v)).start();
       Inter  i=new Inter(v);
     Thread t=new Thread(i);
                 t.start();
                  
       Puter p=new Puter(v);
                 Thread t1=new Thread(p);
                  t1.start();         
  }
}
class  Value{
    private   String name;
    private   String sex;
          boolean  flag=false;
    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 print(){
                if(!flag)try{this.wait();}catch(Exception e){}   
       System.out.println(Thread.currentThread()+"name====  "+name+"      "+"sex===="+sex);
            flag=false;
                        this.notify();
    }
}                                                                                               // 线程间的通信   通过将共同属性封装在一个类中,并各在两个线程上调用,将两个线程的内容通过该类进行传递
class Inter implements Runnable{
   private boolean b=true;
   private Value v;                                             
      Inter(Value v){                                               //  将Value类类变量 作为构造函数的参数
          this.v=v;
   }
   public void  run(){
      
    while(true){
            synchronized(v){                                                 // 两个线程都要同步
          //   if(v.flag)   
       //    try{v.wait();}catch(Exception e){}                                                          //等待      等待线程存在线程池
               if(b){
                            v.set(" 张张张","男男男男男");
                            b=false;
                           }
                        else{                                      
                               v.set(" 李","女");
                            b=true;
                         }
          //  v.flag=true;
         // v.notify();                                             // 唤醒线程,通常唤醒第一个等待的线程     
       }                                                              //notifyAll();唤醒线程池所有
    }
}
}
class Puter implements Runnable{
    private Value v;
       Puter(Value v){
          this.v=v;
   }
  public void  run(){
         
    while(true){
           synchronized(v){
                                // if(!v.flag)try{v.wait();}catch(Exception e){}   
                            v.print();
                 //     v.flag=false;
                         //   v.notify();
     }
    }
}
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
在我这没错啊。。你什么错误,贴一下。。
回复 使用道具 举报
Exception in thread "Thread-1" java.lang.NoSuchMethodError: Value.print()V
        at Puter.run(Noname1.java:70)
        at java.lang.Thread.run(Thread.java:619)
Exception in thread "Thread-0" java.lang.NoSuchMethodError: Value.set(Ljava/lang/String;Ljava/lang/String;)V
        at Inter.run(Noname1.java:47)
        at java.lang.Thread.run(Thread.java:619)
回复 使用道具 举报
我这两天在看线程,现在在发觉看会和学会是不一样的。还是请大侠来吧
回复 使用道具 举报
我编译运行也没有问题
回复 使用道具 举报
这个代码我是复制在一个eclipse的class上运行的,之前好像也定义过Value 类,难道是这个原因
回复 使用道具 举报
技术有限看的真蛋疼,半天没看出来有什么问题,运行也没有问题。
不过有几个疑问:1、你for后面没加括号,虽然默认执行下一句但最好加括号。
2、你这个程序到底是个什么意义,一个线程不停的改数据,另一个不停的打印。
3、打印的线程又没有修改数据加什么synchronized,一点意义都没有,不加得到的结果也是一样的啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马