3

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

下面代码的输出是Im. Im由于没有其他线程调用notify()Thread 对象,因此输出如何。是否像 JVMnotify()在您尝试等待 Thread 类实例的上述场景中隐式调用。

线程操作在等待而没有收到任何通知时会卡住。现在,如果我等待 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");
    }
}
4

1 回答 1

10

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

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

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

于 2013-05-03T15:29:30.893 回答