public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();

synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){ }
System.out.println("Total is : " +b.total);
}
}
}class ThreadB extends Thread{
int total;

public void run(){
synchronized(this){
for(int i = 0;i<100;i++){
total+=i;
}
notify();
}
}
}请问代码里的b.wait()和notify()有什么意义吗?
b.start()这句执行之后关于计算的代码不是应该已经完成了吗?为什么还可以wait?

解决方案 »

  1.   

    如果线程执行时间很长,比如100秒,你再考虑看看。
    其实,如果只有一个子线程,主线程可以不管。因为系统会自动等待所有普通线程完成。
    如果你为了等待某个线程,可以用join。
      

  2.   

    不好意思,可以解释的再具体点吗?假设b的运行时间很长,那么在运行过程中主线程运行了b.wait()让b停下来等待.那么b里面的notify()有意义吗?这句应该永远走不到的吧?
      

  3.   

    请问代码里的b.wait()和notify()有什么意义吗? 
    wait()和notify()是Object里面的方法,wait()是 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。而notify()唤醒在此对象监视器上等待的单个线程,至于唤醒那个事随即的,至于为什么要使用这两个函数可以看一下生产者与消费者的例子
    b.start()这句执行之后关于计算的代码不是应该已经完成了吗?为什么还可以wait?
    main方法也是一个线程,主线程和ThreadB是交替执行的
      

  4.   

    main线程执行到b.wait()时,b.run()还没执行完,所以在run()里需要notify()主线程
      

  5.   

    如果主线程先锁定这个对象,那么程序可以顺利运行。b.wait()指主线程wait在对象上,应为wait会释放锁。这时才进入计算,计算结束唤醒主线程。主线程执行完毕。
    如果子线程先锁定对象。子线程执行结束后唤醒这个对象上等待这的线程(现在没有),释放锁。主线程得到锁运行,wait了就一直wait了,没有人来唤醒他。
      

  6.   

    b.wait 是当前线程释放b的同步锁,然后当前线程进入等待状态。
    不是让b等待。