java - 当它的运行方法结束时,线程是否运行 this.notifyAll?
问题描述
这段代码不会被阻塞。虽然 main 方法会在线程中等待,但似乎这个对象会调用 this.notifyAll?
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
thread.join();
synchronized (thread) {
thread.wait();
}
System.out.println("stop");
}
}
解决方案
只回答标题中的问题:
当它的运行方法结束时,线程是否运行 this.notifyAll?
Oracle Java 12 版本的文档说,是的,该join()
方法调用wait()
等待线程已终止的通知。
但请注意!它还说,“建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。” 它还说,“......这个实现......”其他一些Java运行时环境可能会thread.join()
以不同的方式实现,如果你运行它,依赖于线程终止时Thread
要编辑的对象的程序可能无法工作notify()
在另一个 JRE 上。
另外,请参阅@akuzminykh 的回答。概括:
notify()
andnotifyAll()
方法根本不做任何事情,除非其他线程已经在等待调用wait()
。如果您的程序自行终止,那很好,但您不应该依赖它自行终止。到主线程调用thread.wait()
时,没有理由期望任何其他线程会调用thread.notify()
,因此没有理由期望thread.wait()
不会永远等待。
我只是好奇它的机制
join
...
Thread
查看该类的 OpenJDK 版本的源代码。
该join()
方法只调用join(0)
,并且在millis
参数join(long millis)
为零的特殊情况下,它所做的只是:
while (isAlive()) {
wait();
}
换句话说,它所做的只是wait()
直到线程不活跃为止。
笔记!您不会在源文件中找到该notify()
调用。在线程的方法返回或抛出异常Thread.java
之后,通知发生在其他地方(可能是本机代码?) 。run()
推荐阅读
- python - mongodb-client-encryption 的节点高山映像编译错误
- sql - 如何创建具有特定 Order by 的 Oracle SQL?
- if-statement - 使用 guile 的 Scheme 中的 if-else 语句错误
- reactjs - 如何将某个 LIST 从一个组件传递到 REACT JS 中的另一个组件?
- php - 我的 laravel.log 文件中有这个错误。我不知道发生了什么
- python - 为什么绑定类实例方法与绑定类方法不同?
- go - 使用 client-go 列出 NodeMetrics
- r - 两次迁移学习
- powershell - 如何将单个命令注入到 powershell 历史记录中?
- java - 在 Spring Boot 中将带有图像的 HTML 内容存储在文件中时出错