谁在线程结束时通知线程?
我有一个关于基于等待/通知的线程交互的问题。
以下代码的输出是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()
。