一段程序阐述下wait和notify
来源:互联网 发布:vb.net实例教程 编辑:程序博客网 时间:2024/05/21 23:00
wait()和notify()函数属于Object类,也就是说所有的对象都拥有这两个函数。
wait()我们可以理解为等待的意思,即等待锁的释放。引用说明文档的话“Causes the current thread to wait until another thread invokes thenotify()
method or thenotifyAll()
method for this object.”,那就是等待着别的线程的notify()操作后本线程wait()后的代码才会被执行(wait取消了阻塞状态)。
但是notify()并不一定会使得这一个wait()取消阻塞,notify()只是令一个wait()取消阻塞,如果同一时刻有多个线程采用同一个Object进入wait()状态,哪个线程取消阻塞状态由JVM决定。如果要所有采用了同一个Object的wait()取消阻塞,那么可以采用notifyAll(),必须注意的是,上面说的这些wait都是用同一个Object加锁的。
另外要提到一点,wait()和notify()操作前要使用synchronized(obj),不然会报java.lang.IllegalMonitorStateException错误。
下面是代码:
class Test {public static void main(String[] args) {Object obj = new Object();new myThread(obj).start();synchronized (obj) {try {obj.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("ok");}}}class myThread extends Thread {Object obj;public myThread(Object obj) {// TODO Auto-generated constructor stubthis.obj = obj;}@Overridepublic void run() {synchronized (obj) {// TODO Auto-generated method stubtry {sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}obj.notify();}}}
10S后才打印ok。
要注意的是,notify()必须要在wait()之后调用,不然会造成wait()永久阻塞。上面的代码之所以会成功运行,是因为调用了
new myThread(obj).start();之后新线程并不一定马上运行,所以run方面可能还没运行,因此nitify()位于wait()之后执行。严格来说,上面的这段代码是非常危险的,仅限于说明用。
0 0
- 一段程序阐述下wait和notify
- synchronized和wait()/notify()
- wait和notify实例
- wait()和notify()
- wait和notify使用
- notify 和wait
- notify 和wait 2
- wait(),notify()和锁
- wait和notify
- 理解wait和notify
- synchronized和wait()/notify()
- wait和notify实例
- 正确理解wait 和 notify
- wait()和notify()/notifyAll()
- wait()和notify()、notifyAll()
- 多线程-notify和wait
- wait和notify区别
- java wait和notify
- log4j日志的用法
- 大数据时代聊聊小数据
- pureftp配置
- db2中的fetch first n rows 与 oracle中的rownum
- HDU1698
- 一段程序阐述下wait和notify
- 开源项目网址
- 一个简单的使用jdom解析xml例子
- 适合“月光小百姓”的普通理财法
- 拆分字符串的算法,该算法支持中英文
- VS2010 solution中完美的相对路径引用方法
- cocos2dx3.0rc如何创建新工程
- 第七周作业
- Twitter 宣布收购社交数据提供商 Gnip