谁在线程结束时通知线程?

我有一个关于基于等待/通知的线程交互的问题。

以下代码的输出是Im 。 如何输出可以是Im因为在Thread对象上没有其他线程调用notify() 。 是否像JVM在上面尝试等待Thread类实例的情况下隐式调用notify()

线程操作在等待时没有收到任何通知就会卡住。 现在如果我等待Thread类实例wait() 。 例如

 public class WaitingThread { public static void main(String[] args) { Thread t1 = new Thread(); t1.start(); synchronized (t1) { try { t1.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Im"); } } 

你的程序正在离开wait()因为线程正在立即完成。 这是Thread库的副产品,当线程完成时会通知Thread对象。 这就是join()工作原理,但它不是应该依赖的行为,因为它是线程子系统的内部。

如果您正在尝试等待线程完成,那么您应该使用t1.join()方法。

您的线程立即完成,因为它没有定义run()方法,因此它已启动并完成。 确实这是一个竞争条件,启动的线程可以主线程进入wait()方法调用之前完成。 如果在调用start()之后进行短暂睡眠(可能是10ms),则可以看到此信息。 然后你可以看到你的程序将永远坐在wait()