直接上源码:package com.work;class Resource{
 int Goods=0;
 boolean choose=false;
}
class Consumer implements Runnable{  //消费者
Resource r;
    public Consumer(Resource r){
     this.r=r;
    }
public void run() {
       synchronized (r) {
while (true) {
if (r.choose==true) {
r.Goods--;
r.choose=false;
System.out.println("消费了"+r.Goods);
}
     }
  }
}
  }
class Producer implements Runnable{  //生产者
Resource r;
    public Producer(Resource r){
     this.r=r;
    }
public void run() {
 synchronized (r) {
while (true) {
if (r.choose==false) {
r.Goods++;  //1
r.choose=true;
System.out.println("生产了"+r.Goods);
}
}
      }
        }
       }public class Sample {

    public static void main(String[] args) {
   Resource r=new Resource();
   Consumer con=new Consumer(r);
   Producer pro=new Producer(r);
   Thread b=new Thread(pro);
   b.start();
   Thread a=new Thread(con);
   a.start();
 }
}现象:
只答应了 生产了1,然后线程停在哪?求解释,谢谢各位!!! 

解决方案 »

  1.   

             synchronized (r) {
                while (true) {
                    if (r.choose==false) {
                        r.Goods++;  //1
                        r.choose=true;
                        System.out.println("生产了"+r.Goods);
                    }
                }    
              }        线程停在这了,这个while(true) 循环一直进行下去。
    原因是这段程序在同步块中,消费线程永远都不会执行。(因为同步锁一直不释放)。你可以把同步块标在while里面。象这样:            while (true)
        {
              synchronized (r)
      {     
                     if (r.choose==false)
            {
                         r.Goods++;  //1
                         r.choose=true;
                         System.out.println("生产了"+r.Goods);
                     }
                 }    
                } 
     
      

  2.   


    class Resource {
    int Goods = 0;
    boolean choose = false;
    }class Consumer implements Runnable { // 消费者
    Resource r; public Consumer(Resource r) {
    this.r = r;
    } public void run() { while (true) {
    synchronized (r) {
    if (r.choose == true) {
    r.choose = false;
    System.out.println("消费了" + r.Goods--);
    }
    }
    }
    }
    }class Producer implements Runnable { // 生产者
    Resource r; public Producer(Resource r) {
    this.r = r;
    } public void run() { while (true) {
    synchronized (r) {
    if (r.choose == false) {
    r.Goods++; // 1
    r.choose = true;
    System.out.println("生产了" + r.Goods);
    }
    }
    }
    }
    }public class Sample { public static void main(String[] args) {
    Resource r = new Resource();
    Consumer con = new Consumer(r);
    Producer pro = new Producer(r);
    Thread b = new Thread(pro);
    b.start();
    Thread a = new Thread(con);
    a.start();
    }
    }
      

  3.   

    后来我也发现了问题出在什么地方,不过还是要谢谢各位,还有个问题,如果线程被CPU剥夺了执行权,它会不会把锁也释放了?
      

  4.   

    class Resource{
        int Goods=0;
        boolean choose=false;
    }
    class Consumer implements Runnable{  //消费者
       Resource r;
       public Consumer(Resource r){
           this.r=r;
       }
       public void run() {
           while (true) {
               synchronized (r) {

               if (r.choose==true) {
                   r.Goods--;
                   r.choose=false;
                   System.out.println("消费了"+r.Goods);
               }
            }
         }        
       }
     }
    class Producer implements Runnable{  //生产者
       Resource r;
       public Producer(Resource r){
           this.r=r;
       }
       public void run() {
               while (true) {
                synchronized (r) {

                   if (r.choose==false) {
                       r.Goods++;  //1
                       r.choose=true;
                       System.out.println("生产了"+r.Goods);
                   }
               }    
             }        
           }
          }
    把这两行对调以下位置就好了,你应该是想在操作Resource的时候互斥,可你把死循环也放在同步块里面,线程根本就跳不出去抢用资源,所以就出现你这种情况了