发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

wait() and notify()

2003-09-27 15:07
赞助商链接

有一段程序:
public class WaitAndNotify extends Thread{
public synchronized void run(){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace(System.err);
}
}

public static void main(String[] args){
WaitAndNotify wan=new WaitAndNotify();
wan.start();
synchronized(wan){ //1
wan.notify(); //1
} //1
}
}

按照我的想法程序应该按下面的顺序运行:
1 开始新的线程(wan.start())
2 线程在run()方法中被阻塞
3 因为是调用的wait()阻塞线程,所以wan对象上的锁应当被放弃,从而使//1的代码被执行,线程被唤醒,程序得以继续执行

可实际情况是:
wan.start()被调用,线程被阻塞,没有继续向下执行。不知道是什么原因?
小弟初学, 还请多多关照

2003-09-27 16:34

你对wait() and notify() 机制有一定误解。
wait() 和notify一般需要在同一个synchronized 点。

2003-09-28 19:30

在wan.start()呼叫之后,会有两个线程同时运行:main线程和wan代表的线程。但问题是,接下来哪个线程会被调度执行呢?You never know!
如果是wan代表的线程先执行,结果就是你所希望的。
但如果是main线程首先执行,wan线程就会永远在wait方法中等待。

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com