线程中的notify和wait的问题.

chenzhehui 2009-07-16 04:22:17
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() 白写了吗?

我想知道这个程序的执行顺序.
谢谢
...全文
34 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhehui 2009-07-18
  • 打赏
  • 举报
回复
synchronized(b)
{
try
{
System.out.println("Waiting for b to complete...");
b.wait();
System.out.println("Completed.Now back to main thread");
}

问题我清晰很多了.
如果是上面的代码的话,这的有可能出现死锁.经多次试验证明.
然而.上面代码可以优化.加一个条件判断然后再调用wait,这样可以防止死锁情况出现.
最后,谢谢大家
greenwater007 2009-07-16
  • 打赏
  • 举报
回复
upupiup
chenzhehui 2009-07-16
  • 打赏
  • 举报
回复
这个类的确是一个自写类,但是不是我写的,我是在网上看到的一个例子.算经典的了
我只想知道他们的执行顺序.
txf_7337 2009-07-16
  • 打赏
  • 举报
回复
一般B打印100行时,A老早就在等待锁状态了。除非:B的优先级最高,A的优先级最低,有可能出现死锁。
txf_7337 2009-07-16
  • 打赏
  • 举报
回复
我电脑是单核的,对这个程序而言,出现死锁的几率很小,不知道双核的怎样?
Asinzy 2009-07-16
  • 打赏
  • 举报
回复
你这是一个学习线程的自写类么?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧