首页 > 解决方案 > 当它的运行方法结束时,线程是否运行 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");
    }
}

标签: javamultithreading

解决方案


只回答标题中的问题:

当它的运行方法结束时,线程是否运行 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 版本的源代码。

http://hg.openjdk.java.net/jdk10/jdk10/jdk/file/777356696811/src/java.base/share/classes/java/lang/Thread.java

join()方法只调用join(0),并且在millis参数join(long millis)为零的特殊情况下,它所做的只是:

while (isAlive()) {
    wait();
}

换句话说,它所做的只是wait()直到线程不活跃为止。

笔记!您不会在源文件中找到该notify()调用。在线程的方法返回或抛出异常Thread.java之后,通知发生在其他地方(可能是本机代码?) 。run()


推荐阅读