public class MyThread extends Thread 

         static int TOTAL=5; 
         final static int PRICE=5; 
         int number; 
         int money; 
         public MyThread(int number,int money) 
         { 
                this.number=number; 
                this.money=money; 
         } 
         public static void main(String args[]) 
         { 
                  new MyThread(2,20).start(); 
                  new MyThread(1,20).start(); 
                  new MyThread(2,10).start(); 
                  new MyThread(1,10).start(); 
                  new MyThread(1,5).start(); 
         } 
         public synchronized void run() 
         { 
                  int back=money-PRICE*number; 
                  if(back>TOTAL) 
                      
                      try{ 
                               wait();  
                         } 
                      catch(InterruptedException e) 
                         { 
                                 throw new RuntimeException(" cannot wait()"); 
                         } 
                  System.out.println("Hello! "+Thread.currentThread().getName()+", this is your "+number+" ticket!we give you back"+back+"yuan"); 
                  TOTAL=TOTAL+PRICE*number; 
                  notifyAll(); 
         } 

========================== 
请问Thread0和Thread1为什么没有执行呢?也就是前面两个线程没反应,只执行了后面三个线程,而且程序进入了停滞不前的状态?? 
请问错误在哪里呢????? 

解决方案 »

  1.   

    你的写法都错了 public synchronized void run()  是重写Tread的方法,不能同步run,这个run是每个线程单独使用的。
    你要同步就要另外写一个类,然后创建一个对象,让这些线程都共享一个对象,就可以了。
      

  2.   

    不是没执行,back>TOTAL这个条件让线程在wait,并且一直陷入等待状态
      

  3.   

    因为第一个和第二个线程因为满足back>TOTAL 而执行wait()方法,在jdk 的文档中说wait()是在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。因为第二三四个线程因为不满足back>TOTAL 所以就幸运的不用wait()可以执行if之外的代码而在你的代码中看到有个 notifyAll()方法,按你的意思是想唤醒其他waite了的线程继续执行程序,可是我们说notifyAll()是只能够唤醒持有同样监视器的线程,然而在同步函数他所使用的监视器是this 即是本身自己这个对象,可你是创建了四个不同的线程对象,所以四个线程的同步函数监视着四个不同的监视器,所notify()方法不能像不设想的一样唤醒其他线程,所以第一二个线程就一直waite() 可就算其他(二三四)的线程中进行了notify 了但这样似乎不起用,因为这四个线程的同步代码块监视的是不同的监视器,所以唤醒不了一直在苦苦wait的0 和1 线程了。。这样不知道我说清楚了没有,希望你能理解。 
      

  4.   

    你让0和1 wait了,但是你没有在其他地方让他们醒过来