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() 白写了吗?我想知道这个程序的执行顺序.
谢谢
{
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() 白写了吗?我想知道这个程序的执行顺序.
谢谢
{
try
{
System.out.println("Waiting for b to complete...");
b.wait();
System.out.println("Completed.Now back to main thread");
}
问题我清晰很多了.
如果是上面的代码的话,这的有可能出现死锁.经多次试验证明.
然而.上面代码可以优化.加一个条件判断然后再调用wait,这样可以防止死锁情况出现.
最后,谢谢大家