Java多线程学习 (三) Thread的wait()方法执行

本文探讨了在Java多线程环境中,`wait()`方法的使用。通过一个`Depository`类的例子展示了在同步块或方法中调用`wait()`的正确方式。错误地调用`Thread.currentThread().wait()`会导致`IllegalMonitorStateException`,因为当前线程并未持有对象锁。正确的做法是调用包含`wait()`方法的对象的实例,确保线程拥有正确的监视器上下文。

 

 

在上面的①②处的代码,如果用①,那么程序就没有问题,而且应该是调用的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()

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值