Java多线程学习 (三) Thread的wait()方法执行
来源:互联网 发布:大数据分析的书籍 编辑:程序博客网 时间:2024/05/17 02:47
在上面的①②处的代码,如果用①,那么程序就没有问题,而且应该是调用的Depository 类的方法,而不是当前线程的wait()方法。如果使用②的语句,那么会抛一个异常 java.lang.IllegalMonitorStateException: current thread not owner
.
请问第②语句为什么会报错?
第①句处为什么是调用的Depository类的wait()方法,而不是当前Thread的wait()方法
回复:
应该使用wait(),wait 方法的解释是Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.举个例子:比如你有一个Depository 类的对象 d ,然后线程A要访问d的addLast()方法,因为这个addLast()方法时synchronized 所以线程A进入的时候就给这个对象d 加上锁,其它线程不允许访问,当执行到wait()时,线程A就会先打开对象A的锁,并在对象d 外面排队等待。对于IllegalMonitorStateException,我的理解是:一个对象的wait()方法只能在此对象的同步方法中被调用,意思是,这个对象在wait前是被加了锁的。你将addLast方法的synchronized 去掉运行也会抛出这样的异常。所以说你用wait()就可以了。Thread.currentThread().wait();这句话调用的是当前线程对象的wait()方法,当前线程对象没有被加锁。所以出错。
首先说一下,wait()跟notify() 和notifyAll() 方法是锁的方法,不是线程的方法。因为你的wait()在public synchronized void addLast(Product p) 里面,那么这个锁就是Depository 对象,也就是当前对象。请问第②语句为什么会报错?因为当前锁不是Thread.currentThread()
- Java多线程学习 (三) Thread的wait()方法执行
- Java Thread.wait方法
- Java多线程学习 (二) Thread的join()方法
- 浅谈Java多线程中的Thread.sleep()和wait()方法的区别
- java 三种多线程的创建方法Thread,Handler,Runnable
- java 三种多线程的创建方法Thread,Handler,Runnable
- 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等
- 初识java多线程的wait(), notify()方法
- java多线程学习(六)---Thread其它方法
- Thread类的sleep()方法和对象的wait()方法都能使线程暂停执行,他们有什么区别?
- java object的wait和Thread的sleep方法区别
- java object的wait和Thread的sleep方法区别
- java object的wait和Thread的sleep方法区别
- java多线程三种方式区别,java多线程,线程同步方式,线程同步加锁的方法,wait与sleep区别
- 【多线程】(三)java.lang.Thread小结
- Java多线程 Thread 方法
- (2)Java多线程Thread提供的方法
- java多线程(2)Thread的实例方法
- 一个java fop做报表的问题请教高手解决!
- jstl jsp servlet 版本问题。
- Integrating your project in the PUBLIC tree
- 2011年北京地铁图
- 嵌入式tftp环境的构建
- Java多线程学习 (三) Thread的wait()方法执行
- 曲径通幽
- 尽量避免在.h文件中写实现代码避免交叉引用失败
- pb 基础
- 数据集 DataRow.RowState 属性深入分析
- Android网络编程之Http通信
- MOCK编写UT Case的步骤
- 【转】中国人名字的first name和last name
- 如何诊断Windows CE的应用程序崩溃