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

以下代码的输出是 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/

10-14 18:49
查看更多