我有一个关于基于等待/通知的线程交互的问题。
以下代码的输出为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");
}
}
答案 0 :(得分:10)
你的程序正在离开wait()
因为线程正在立即完成。这是Thread
库的副产品,在线程完成时通知Thread
对象。这就是join()
的工作原理,但它应该依赖于不行为,因为它是线程子系统的内部。
如果您正在尝试等待线程完成,那么您应该使用t1.join()
方法。
您的线程正在立即完成,因为它没有定义run()
方法,因此它已启动并完成。实际上它是一个竞争条件,并且启动的线程可以在主线程到达wait()
方法调用之前完成。如果在调用start()
后进行短暂睡眠(可能是10毫秒),您可以看到这一点。然后,您可以看到您的程序将永远位于wait()
。