java-等待方法唤醒而不调用notify(NOT SPURIOUS WAKEUP)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-等待方法唤醒而不调用notify(NOT SPURIOUS WAKEUP),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1582字,纯文字阅读大概需要3分钟。
内容图文
![java-等待方法唤醒而不调用notify(NOT SPURIOUS WAKEUP)](/upload/InfoBanner/zyjiaocheng/667/507c7c09a452497d9f8b2ffd93fb923f.jpg)
在下面的语句中,即使没有调用notify,也会执行wait()方法,但是wait()下面的语句仅在月桂树线程完成执行后才执行.
我尝试使用其他对象锁定Hardy Block的同步,这时wait方法仍然永远在等待,有人可以解释一下为什么执行了wait()之后的语句吗?
package delagation;
public class Solution extends Thread {
static Thread laurel, hardy;
public static void main(String[] args) throws InterruptedException {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
System.out.println("D");
try {
synchronized(laurel) {
laurel.wait();
//wait method is called here,
//There is not notify in this class,
//but the statement below are executing
System.out.println(Thread.currentThread().getName());
}
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
};
laurel.setName("laurel");
hardy.setName("hardy");
laurel.start();
hardy.start();
}
}
解决方法:
您无需假设虚假的唤醒来解释这里发生了什么.当月桂树终止时,它将向所有正在等待它的线程发送一个notifyAll. (这是Thread.join的工作方式.)
请参阅api文档中的Thread#join:
This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.
另外,请始终使用条件在循环中等待;请参阅Oracle并发教程,尤其是“保护块”页面. (从描述中可以看到,join在一个循环中循环等待,其中被连接的线程上的测试条件为isAlive,因此这是一个很好的例子.您可以在Thread类的jdk源代码中找到join方法.)
内容总结
以上是互联网集市为您收集整理的java-等待方法唤醒而不调用notify(NOT SPURIOUS WAKEUP)全部内容,希望文章能够帮你解决java-等待方法唤醒而不调用notify(NOT SPURIOUS WAKEUP)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。