黑马程序员技术交流社区
标题:
为什么wait(),notify(),notifyAll()只能写在同步锁里?
[打印本页]
作者:
yang9876q
时间:
2015-6-9 15:15
标题:
为什么wait(),notify(),notifyAll()只能写在同步锁里?
为什么wait(),notify(),notifyAll()只能写在同步锁里?
作者:
wenweishan2015
时间:
2015-6-9 16:24
这些方法的调用方式就是同步锁中的锁.方法,就是这样:
synchronized (obj) { //obj是无意义对象,即锁
obj.wait();
}
复制代码
拥有钥匙的线程会进入这段代码,wait()让线程进入暂停状态。
如果wait()方法在这段代码外面,由于外面有多个线程,我们是不知道wait()到底是让哪一个线程暂停,而在同步锁里,只有拥有钥匙的线程才会进入,且只有这一个线程,所以wait()当然是让这一个线程暂停,其他两个方法也是这样的
作者:
黑与白
时间:
2015-6-9 16:52
wait()是等待,notify()是唤醒,notifyAll()是唤醒所有,它们的出现是线程的几个状态之间切换时使用的语句,同步锁的出现时为了确保线程的安全,
作者:
FY軒
时间:
2015-6-9 16:55
而且wait只能由要等待的线程自己调用而不能这样
Thread a = new Thread(xxxx);
a.start(); //线程开始运行
a.wait(); //线程暂停
a,notify(); //线程继续运行
而只能将调用wait()方法的语句放到线程所要执行的代码里面,并且还要在同步块里:
run()
{
Thread.currentThread().wait();
}
和
run()
{
synchronized(this) {
Thread.currentThread().wait();
}
}
都会报 java.lang.IllegalMonitorStateException。必须得
run()
{
Thread t = Thread.currentThread();
synchronized(t) {
t.wait();
}
}
这样写才没事,我实在搞不懂这样的话wait(),notify(),notifyAll()这几个方法有什么用呢?特别是notifyAll(),wait()不是只能停止一个线程吗?因为它只能在线程的对象上调用啊例如t.wait()就相当于t暂停,而再调用t.notify()那么t继续运行,始终暂停和唤醒的只有线程t呀
作者:
yang9876q
时间:
2015-6-10 13:32
wenweishan2015 发表于 2015-6-9 16:24
这些方法的调用方式就是同步锁中的锁.方法,就是这样:
拥有钥匙的线程会进入这段代码,wait()让线程进入 ...
谢谢,学习了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2