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”可以呢? 展开
try{
if(...){
...
} else{
wait();System.out.println("aa");}
System.out.println("bb");notify();System.out.println("cc");
}catch(Exception e){}
请问:为什么“aa”总是不能打印出来,而“bb”和“cc”可以呢? 展开
3个回答
展开全部
wait()是用来锁定一个对象的,在调用这个notify()方法前,他后面的代码永远不会被执行。这种锁定不能够自动解锁, 你必须在另一个线程中调用这个对象的notify()方法。
你的代码,如果执行了else里面的代码,则notify()不会执行,而能执行notify()说明else里面的代码没有被执行,注意,notify()一定是在另外一个线程中调用的,用wait()这样的锁是不可能在自己的线程中解锁的。
你的代码,如果执行了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()不可能把第二个线程的锁解开。
展开全部
我好像记得,像wait和notify方法,都是要靠对象去调用的吧, 也就是 “对象.wait() ” 这样。 你这样直接使用wait()和")notify()方法,难道你重写这些方法吗?
你的程序编译能通过吗,是不是根本就没执行else条件啊?
你的程序编译能通过吗,是不是根本就没执行else条件啊?
追问
可以编译通过。而且如果是在wait()前面加一句System.out.println("dd");是可以打印出来的,说明else已经执行了。
追答
这段代码我怎么感觉都好像有点问题,也许是你代码没有贴完整,也可能是我个人水平有限,你把notify()换成notifyAll()试试,如果还不行,如果你采用的时eclipse等类似IDE,你可以debug一下,看看问题在哪。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
wait()这个地方有点古怪。这是线程特有的吧。用该使用.wait()方法的吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询