我有一个关于基于等待/通知的线程交互的问题。
以下代码的输出是 Im
。由于没有其他线程在 Thread 对象上调用 Im
,因此输出如何成为 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()
后进行短暂的 sleep (可能是 10 毫秒),您可以看到这一点。然后你可以看到你的程序将永远坐在 wait()
中。
关于java - 当线程完成时,谁通知线程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16362475/