class ThreadA
{
    public static void main(String[] args)
    {
      ThreadB b=new ThreadB();
      b.start();
      System.out.println("b is start....");
      synchronized(b)
      {
        try
        {
            System.out.println("Waiting for b to complete...");
            b.wait();
            System.out.println("Completed.Now back to main thread");
        }catch (InterruptedException e){}
      }
      System.out.println("Total is :"+b.total);
     }
}
class ThreadB extends Thread
{
    int total;
    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();
      }
    }
}我对这里有点不明白,我不明白的地方是,在主方法里面,用b.start()启动线程,然而,这只是使线程准备,不能确定是否马上执行这个线程,然而,在这里,该线程的run()里面有个同步块,里面调用了notify(),目的用来唤醒自己的.
   而使线程wait的也是在主方法那里,
我想知道的是:
如果程序开始的时候就马上执行了线程的run()方法,而那时候的b.wait()还没被调用,那么run()中的notify都被执行了,这样的话不是把主方法的b.wait() 白写了吗?我想知道这个程序的执行顺序.
谢谢

解决方案 »

  1.   

    一般B打印100行时,A老早就在等待锁状态了。除非:B的优先级最高,A的优先级最低,有可能出现死锁。
      

  2.   

    synchronized(b)
          {
            try
            {
                System.out.println("Waiting for b to complete...");
                b.wait();
                System.out.println("Completed.Now back to main thread");
            }
    问题我清晰很多了.
    如果是上面的代码的话,这的有可能出现死锁.经多次试验证明.
    然而.上面代码可以优化.加一个条件判断然后再调用wait,这样可以防止死锁情况出现.
    最后,谢谢大家