谁完成后会通知线程?

Hit*_*esh 3 java multithreading

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

以下代码的输出是Im.如何输出,Im因为没有其他线程调用notify()Thread对象.是否像JVM notify()在上面尝试等待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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*ray 10

你的程序正在离开,wait()因为线程正在立即完成.这是Thread库的副产品,Thread当线程完成时通知对象.这是join()有效的,但它不是应该依赖的行为,因为它是线程子系统的内部.

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

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

  • 对于downvoter:自Java 7以来记录了这种行为:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join%28long%29 (2认同)