如果在main()中启动一个新线程,那么调用wait()可以阻止主线程吗?

时间:2017-05-09 07:36:54

标签: java multithreading

只看代码

static class ThreadA extends Thread {
    public ThreadA(String name) {
        super(name);
    }

    @Override
    public void run() {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName() + " call notify()");
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    ThreadA t1 = new ThreadA("t1");

    synchronized (t1) {
        System.out.println("start:  " + Thread.currentThread().getName());
        t1.start();

        t1.wait();
        System.out.println(" -- end -- ");
    }
}

,输出为:

start:  main
t1 call notify()
 -- end -- 

为什么调用wait()不会阻塞主线程

2 个答案:

答案 0 :(得分:2)

您的问题的答案可以在join(long millis)方法的javadoc中找到:

  

此实现使用this.wait调用on.isAlive的循环。 当线程终止时,将调用this.notifyAll方法。建议应用程序不要在Thread实例上使用wait,notify或notifyAll。

(强调我的)

所以:你的主循环停止等待,因为它正在等待的线程在它完成时自己调用notifyAll

正如其他人已经指出的那样,等待线程完成的正确方法是调用join

答案 1 :(得分:1)

您需要的是Thread.join()Object.wait()的目的是等到该对象的监视器锁定被另一个线程释放(使用Object.notify()Object.notifyAll())。

public static void main(String[] args) throws InterruptedException {
    ThreadA t1 = new ThreadA("t1");

    synchronized (t1) {
        System.out.println("start:  " + Thread.currentThread().getName());
        t1.start();

        t1.join();
        System.out.println(" -- end -- ");
    }
}