如果你的kg不是正确的状态你在同步方法里要调用wait(),让线程挂起啊。

解决方案 »

  1.   

    把生产者和消费者的属性改成:private static kz;因为生产者和消费者共享资源时才有生产者和消费者问题.而且get和put只能对某个类对象同步,而不是对任意多个类对象同步.
      

  2.   

    请问楼主要怎样的效果,该代码已经是线程同步了,每个get和put操作都已经保证了对kz对象的唯一操作
      

  3.   

    //改成这样吧
    public class cls1 {             //总控制
        public static void main(String args[]){
            cls4 kz=new cls4();
            cls2 sc=new cls2(kz);
            cls3 xf=new cls3(kz);
            sc.start() ;
            xf.start() ;
        }
    }class cls2 extends Thread{         //生产者
      cls4 kz;
      public cls2(cls4 kz) {
           this.kz=kz;
      }  public void run(){
        synchronized(kz){
          for(int i=0 ;i<10;i++){
            this.kz.put(i) ;
            kz.notify();
            try{
              kz.wait();
            }catch(Exception e){}
          }
        }
      }
    }class cls3 extends Thread {   //消费者
      cls4 kz;
      public cls3(cls4 kz) {
         this.kz=kz;
      }  public void run(){
        synchronized(kz){
          for(int i=0;i<10;i++){
            System.out.println(kz.get()) ;
            kz.notify();
            try{
              kz.wait();
            }catch(Exception e){}
          }
        }
      }
    }
    class cls4 {
      private int val;
      private boolean kg=false ;  //控制变量
      public int get(){
         kg=false;
         return val;
      }  public void put(int i){
          val=i;
          kg=true;
      }
    }
      

  4.   

    public class cls1 {             //总控制
        public static void main(String args[]){
            cls4 kz=new cls4();
            cls2 sc=new cls2(kz);
            cls3 xf=new cls3(kz);
            sc.start() ;
            xf.start() ;    }}public class cls2 extends Thread{         //生产者
      cls4 kz;
      public cls2(cls4 kz) {
           this.kz=kz;
      }  public void run(){
        for(int i=0 ;i<10;i++){
         if(kz.getKZ()==false)
             this.kz.put(i) ;
        }  }}
    public class cls3 extends Thread {   //消费者  cls4 kz;
      public cls3(cls4 kz) {
         this.kz=kz;
      }
      public void run(){
           for(int i=0;i<10;i++){
              if(kz.getKZ())
                System.out.println(kz.get() ) ;
           }
      }}
    public class cls4 {
      private int val;             
      private boolean kg=false ;  //控制变量
      public synchronized int get(){
         kg=false;
         return val;  }  public synchronized void put(int i){
          val=i;
          kg=true;
      }
      
      public boolean getKZ()
      {
           return kz;
      } 
    }