java里多线程的wait问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java里多线程的wait问题相关的知识,希望对你有一定的参考价值。
如果一个可被多个线程访问的资源类的某一个synchronized方法里有wait(),当这个wait()被调用时,是让当前进入到synchronized方法的这个线程进入wait,还是这个资源类进入wait?如果是线程进入wait,那为什么不是在线程类上调用wait()而是在资源类里调用(这里的wait()实际上应该是this.wait())?
如果资源类里是这样的
public synchronized void f()
while(condition)
wait();
System.out.println("f() return;")
那是不是运行到这个循环的时候,进入wait、等待notify并释放锁,但是这个方法并没有返回(控制台没输出)?
condition只是一个用来举例子的条件变量,如果条件不成熟,进入等待,否则就跳过循环执行后面的代码,这里只是示意wait()被执行的条件。
我的问题就是,为什么既然是线程wait,wait()方法却不在线程里调用而是在对象上调用?API里这么说“Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.”,是不是实说对象上的wait()被执行的时候,使current thread 进入wait状态?也就是说wait()可以自动识别当前的线程?
这个我知道,所以说wait的是人,但是wait()、notify()、notifyAll()却在屋子上?
追答不是在屋子上,是挂在某一个资源上,相当于把钥匙放在一个小盒子里,每个线程来的时候先去盒子里面取钥匙,取不到就wait。总不能把这个钥匙放在自己身上吧。
参考技术A 喜欢思考绝对是好事,但我希望你对于一个为题你能自己分析的透彻点,wait()当然是线程去等待,线程讲的就是电脑的cpu如何工作,而你说的资源了只是数据也就是你给电脑的一种指令,数据有什么等待的说法吗?还有你说上面的那个程序不会出来,你那个while的条件是什么,你都没吧,如果是死循环那当然不会出来了。 参考技术B 博客园去啊以上是关于java里多线程的wait问题的主要内容,如果未能解决你的问题,请参考以下文章