class Ham{
    static Object box =new Object();
    static int totalMaterialA=5;
    static int totalMaterialB=7;
    static int salesA=0;
     static int salesB=0;
    static int productionA=2;
    static int productionB=3;
}
class Maker extends Thread{
    void makeA(){
        synchronized (Ham.box){
            Ham.productionA++;
            System.out.println("厨师: 这里有A汉堡!(总"+Ham.productionA+"个)");
            Ham.box.notify();
        }
    }
      void makeB(){
             synchronized (Ham.box){
            Ham.productionB++;
            System.out.println("厨师: 这里有B汉堡!(总"+Ham.productionB+"个)");
            Ham.box.notify();
       } 
       }
    
    public void run(){
        if(getName()=="A"){
        while(Ham.productionA<Ham.totalMaterialA){
            try{
                sleep(3000);
            }catch(InterruptedException ie){}
            makeA();
        }
    }
        if(getName()=="B"){
         while(Ham.productionB<Ham.totalMaterialB){
            try{
                sleep(4000);
            }catch(InterruptedException ie){}
            makeB();
        }    
        }
    }
}class HAssistant2 extends Thread{
    void sellA(){
        synchronized (Ham.box){
            if(Ham.productionA==Ham.salesA){
                System.out.println("请您稍等A!");
                try{
                    Ham.box.wait();
                }catch(InterruptedException ie){}
            }
            if(Ham.productionA>Ham.salesA){
                Ham.salesA++;
                System.out.println("顾客朋友们,A汉堡上来了.(总"+Ham.salesA+"个)");
            }
        }
    }
     void sellB(){
        synchronized (Ham.box){
            if(Ham.productionB==Ham.salesB){
                System.out.println("请您稍等B!");
                try{
                    Ham.box.wait();
                }catch(InterruptedException ie){}
            }
            if(Ham.productionB>Ham.salesB){
                Ham.salesB++;
                System.out.println("顾客朋友们,B汉堡上来了.(总"+Ham.salesB+"个)");
            }
        }
    }
    public void run(){
        while(Ham.salesA<Ham.totalMaterialA){
            System.out.println("<顾客订购A汉堡包.>");
           
            sellA();
            try{
                sleep(1000);
            }catch(InterruptedException ie){}
        }
        while(Ham.salesB<Ham.totalMaterialB){
            System.out.println("<顾客订购B汉堡包.>");
           
            sellB();
            try{
                sleep(2000);
            }catch(InterruptedException ie){}
        }
    }
}
public class Synchronization6 {
     public Synchronization6() {
    }
    
    public static void main(String[] args) {
         Maker makerA=new Maker();
          Maker makerB=new Maker();
          makerA.setName("A");
          makerB.setName("B");
        HAssistant2 assistant=new HAssistant2();
         makerA.start();
         makerB.start();
         assistant.start();
         
    }
    
}
程序没有显示错误,但是结果运行到这里却不动了
<顾客订购A汉堡包.>
顾客朋友们,A汉堡上来了.(总1个)
<顾客订购A汉堡包.>
顾客朋友们,A汉堡上来了.(总2个)
<顾客订购A汉堡包.>
请您稍等A!
不明白出了什么问题,大家帮帮忙啊.

解决方案 »

  1.   

    没仔细看程序。但是可以判断,100%是由于程序死锁了,所以才会不动了。请您稍等A! 后面好象没有notify的缘故?
      

  2.   

    呵呵,我跑了跑,其实没啥大问题!这个程序写得还可以楼主只是犯了一个低级错误,就是Make的run方法从来没执行你没注意到么?看看为什么,那两个if里面都是getName()=="A"我想你是写C#习惯了么?Java比较字符串可不是这么比的哦!改过来就OK了,完毕!