java中wait()的相关问题。

以下是一个代码段:try{if(...){...}else{wait();System.out.println("aa");}System.out.println("bb... 以下是一个代码段:
try{
if(...){
...
} else{
wait();System.out.println("aa");}
System.out.println("bb");notify();System.out.println("cc");
}catch(Exception e){}

请问:为什么“aa”总是不能打印出来,而“bb”和“cc”可以呢?
展开
 我来答
xuhaobooo
推荐于2017-11-24 · TA获得超过282个赞
知道小有建树答主
回答量:103
采纳率:0%
帮助的人:72.2万
展开全部
wait()是用来锁定一个对象的,在调用这个notify()方法前,他后面的代码永远不会被执行。这种锁定不能够自动解锁, 你必须在另一个线程中调用这个对象的notify()方法。
你的代码,如果执行了else里面的代码,则notify()不会执行,而能执行notify()说明else里面的代码没有被执行,注意,notify()一定是在另外一个线程中调用的,用wait()这样的锁是不可能在自己的线程中解锁的。
追问
那假设我定义了3个线程:MyThread[]  mt =new MyThread[3];
在初始化之后将它们开启:for(int i =0;i<3;i++){ mt[i].start(); }
请问这样为什么还是不能将“aa”打印出来呢?
(注:上面那段wait()和notify()方法就在run()方法中调用的)
追答
因为notify()是通知一个对象解锁,如果你前面没有加对象那就是自己了,所以不管你有多少个线程,在你和程序逻辑里面都是在wait()后希望调用notify()来解锁自己,而不是另一个线程来解锁。
你的问题是,你以为三个线程是同一个锁,但你应该明白,你生成三个线程,就是三个对象,每个对象是一个锁,你调用第一个线程的notify()不可能把第二个线程的锁解开。
cs6641468
2011-07-25 · TA获得超过5713个赞
知道大有可为答主
回答量:863
采纳率:100%
帮助的人:988万
展开全部
我好像记得,像wait和notify方法,都是要靠对象去调用的吧, 也就是 “对象.wait() ” 这样。 你这样直接使用wait()和")notify()方法,难道你重写这些方法吗?

你的程序编译能通过吗,是不是根本就没执行else条件啊?
追问
可以编译通过。而且如果是在wait()前面加一句System.out.println("dd");是可以打印出来的,说明else已经执行了。
追答
这段代码我怎么感觉都好像有点问题,也许是你代码没有贴完整,也可能是我个人水平有限,你把notify()换成notifyAll()试试,如果还不行,如果你采用的时eclipse等类似IDE,你可以debug一下,看看问题在哪。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
平凡生活最精彩
2011-07-25 · TA获得超过220个赞
知道答主
回答量:43
采纳率:0%
帮助的人:30万
展开全部
wait()这个地方有点古怪。这是线程特有的吧。用该使用.wait()方法的吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式