public class NotifyTest { /** * @param args */

public static Object lock;

public NotifyTest(){
NotifyTest.lock = new Object();
}

public static void main(String[] args) { // TODO Auto-generated method stub

NotifyTest testNotify = new NotifyTest();       ThreadB b = testNotify.new ThreadB();       b.start();       System.out.println("b is start");
        synchronized(NotifyTest.lock){       try{
       NotifyTest.lock.wait();  // 暂时放弃对象锁,让主线程暂停,让ThreadB开始执行
      
       System.out.println("Waiting for b to complete");
       System.out.println("testPoint");
       }        catch(Exception e){        e.printStackTrace();       }       System.out.println("Final Total is:"+b.total);       } } class ThreadB extends Thread{
int total; public void run() { synchronized(NotifyTest.lock) { System.out.println("ThreadB is running"); for(int i=0;i<100;i++) { total+=i; }
System.out.println("testPoint1");
NotifyTest.lock.notify();  // 执行完毕,唤醒被暂停的线程 } } }}

解决方案 »

  1.   

    其实是因为每次b先执行,都notify了,然后才wait,再也没线程去唤醒了~~~
    可以在ThreadB的run方法前面加上:try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {}试试
      

  2.   

    问题已解决
    原因分析:线程执行很快,在第一个同步块被建立的之前,线程b可能已经执行完毕,主类的同步块就可能永远等待
    修改办法:将线程b的启动部分移入第一个同步块修改后的源代码:
    public class NotifyTest { /** * @param args */

    public static Object lock;

    public NotifyTest(){
    NotifyTest.lock = new Object();
    }

    public static void main(String[] args) { // TODO Auto-generated method stub
    NotifyTest notifyTest = new NotifyTest();
          
    ThreadB b = notifyTest .new ThreadB();
           System.out.println("b is start");
            synchronized(NotifyTest.lock){
           b.start();
           try{
           NotifyTest.lock.wait();  // 暂时放弃对象锁,让主线程暂停,让ThreadB开始执行
                  }
                catch(Exception e){
                    e.printStackTrace();
                }
           System.out.println("Waiting for b to complete");
      System.out.println("testPoint");
           System.out.println("Final Total is:"+ b.total);
                }
    }

    class ThreadB extends Thread{
    int total = 0; public void run(){ synchronized(NotifyTest.lock){
                    try{
                     System.out.println("ThreadB is running");
        for(int i=0;i<100;i++){
         total+=i;
        }
        System.out.println("testPoint1");
        NotifyTest.lock.notify();  // 执行完毕,唤醒被暂停的线程
                    }
        catch(Exception e){
         e.printStackTrace();
        }
        }
        }
    }
    }