下面的示例确保用户在继续之前已经点击了弹出的JOptionPane框(在EDT上)。
package waitexample;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class WaitExample {
public static void main(String[] args) throws InterruptedException {
System.out.println("starting");
Object myWaiter = new Object();
SwingUtilities.invokeLater(() -> {
System.out.println("invoked");
JOptionPane.showConfirmDialog(null, "Message", "Title", JOptionPane.YES_NO_OPTION);
synchronized (myWaiter) {
System.out.println("calling notify");
myWaiter.notify();
System.out.println("notified");
}
});
synchronized (myWaiter) {
System.out.println("waiting");
myWaiter.wait();
System.out.println("done waiting");
}
System.out.println("ending main()");
}
}
但是从以下输出来看,似乎我正在与不同的线程同时进入synchronized(myWaiter)
块:
starting
waiting
invoked
calling notify
notified
done waiting
ending main()
为什么这个程序没有死锁?