谁完成后会通知线程?

时间:2013-05-03 15:26:52

标签: java multithreading

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

以下代码的输出为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");
    }
}

1 个答案:

答案 0 :(得分:10)

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

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

您的线程正在立即完成,因为它没有定义run()方法,因此它已启动并完成。实际上它是一个竞争条件,并且启动的线程可以在主线程到达wait()方法调用之前完成。如果在调用start()后进行短暂睡眠(可能是10毫秒),您可以看到这一点。然后,您可以看到您的程序将永远位于wait()