只看代码
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()不会阻塞主线程
答案 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 -- ");
}
}