【发布时间】:2020-03-03 16:25:09
【问题描述】:
这是来自我的程序。它会打开一个带有按钮的窗口。当我单击按钮时,它应该关闭窗口并唤醒另一个线程。但是,它永远不会唤醒另一个线程。底部的“返回线程”从不打印,我不知道为什么。
public class BrandingGui {
public synchronized void replaceImage() throws IOException{
...
JButton keepButton = new JButton("Keep");
keepButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
frame.dispose();
synchronized(BrandingGui.class) {
//BrandingGui.this.notify();
notifyAll();
}
}
});
...
try {
synchronized(BrandingGui.class) {
this.wait();
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("returned to thread");
}
}
【问题讨论】:
-
注意:
notifyAll()不预期唤醒任何尚未在wait()调用中阻塞的线程。你做了什么来确保你的代码永远不会调用this.wait()在通知已经发布之后? -
也许与您的问题更相关:您确定 ActionListener 中的
this与您的this.wait()调用中的this引用相同的对象吗? (我的 Java 技能有点生疏了,当它出现在匿名内部类的方法中时,我不记得this是什么意思了。) -
创建一个您调用同步、等待和通知的对象。
-
做到了!谢谢哈尔!
标签: java multithreading swing actionlistener