class ThreadB extends Thread{
int total = 0;
public void run(){
synchronized(this){
System.out.println("ThreadB is running...");
for(int i=0;i<100;i++){
total += i;
}
System.out.println("total is "+total);
//notify();
}
}
}
public class ThreadA{
public static void main(String args[]){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
System.out.println("Waiting for b to complete...");
try{
Thread.sleep(3000);
b.wait();  
}catch(InterruptedException e){}      
System.out.println("Completed.Now back to main thread");
}
System.out.println("....Total is:"+b.total);
}
}
/*主线程先得到b的锁,执行到b.wait();的时候,主线程阻塞,释放对象锁,线程b变为运行状态,把notify()注释掉,
没有唤醒主线程,主线程为什么还能继续进行?

解决方案 »

  1.   

    Thread run是一个过程,start后在过程结束后,他的锁就接了
    如果不start他就是一个普通的object如果不notify是不会解锁的
    比如你要是这样
    public class ThreadA{
        public static void main(String args[]){
            ThreadB b = new ThreadB();
            b.start();
            
            synchronized(b){
                System.out.println("Waiting for b to complete...");
                try{
                    //Thread.sleep(3000);
                    b.wait(); 
                    
                }catch(InterruptedException e){}      
                System.out.println("Completed.Now back to main thread");
            }
            System.out.println("....Total is:"+b.total);
            synchronized(b){
             try {
    b.wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
            }
        }
    }最后那个锁就没解
      

  2.   

    最近也在学习线程的东东,不是很明白老兄的意思,wait是不是还与对象有没有调用start方法有关啊。
    还有啊为什么会不是先调用run中的函数啊,新手求解,谢谢!
      

  3.   

    http://topic.csdn.net/u/20100603/19/652b72f1-899e-4e13-ab55-2f324abfbd54.html看下上面那个帖子,里面有解释
      

  4.   

    b线程的run方法都运行完了,也就是b线程已经死亡,b所持有的锁也就释放了,主线程继续。
      

  5.   

    start方法只有Thread有,虽然在源码中没有找到确切证据,但是几乎可以肯定的是一个线程在结束时是解了他本身对象的锁的,所以对于这样一个线程类在他run方法里没有必要notify
    而其他一般的object的子类在一个线程中wait之后如果要在这个线程唤醒则必须在那个获得锁的线程里notify
    为什么不是先调用run中的函数,是因为主线程先得到了b指向的线程对象的锁,你可以试着在主线程里在b.start()之后和锁之间加上sleep(1000),则线程本身的run会先得到锁
      

  6.   


    class ThreadB extends Thread{
    int total = 0;
    static Object obj = new Object();
    public void run(){
    synchronized(obj){
    System.out.println("ThreadB is running...");
    for(int i=0;i<100;i++){
    total += i;
    }
    System.out.println("total is "+total);
    //obj.notify(); 换了一个普通类的对象锁
    }
    }
    }
    public class ThreadA{
    public static void main(String args[]){
    ThreadB b = new ThreadB();
    b.start();
    synchronized(ThreadB.obj){
    System.out.println("Waiting for b to complete...");
    try{
    ThreadB.obj.wait();  
    }catch(InterruptedException e){
    System.out.println("中断");
    }      
    System.out.println("Completed.Now back to main thread");
    }
    System.out.println("....Total is:"+b.total);
    }
    }
    //换了一个普通类的对象锁,如果不notify(),主线程就不能被唤醒?