在我的应用程序中,我有一个文本字段和一个按钮。在文本字段失去焦点后,第一个摇摆工人(假设它是 sw1)被调用。这会打开一个弹出窗口来填充要放入文本字段的值。在用户单击按钮后调用第二个摇摆工人(假设它为 sw2)。现在的问题是,如果我在文本字段中写入内容然后单击按钮,则首先启动 sw1 以计算要放入文本字段的值,同时也启动 sw2。sw2 首先完成,然后 sw1 填充结果。我想要的是 sw2 应该等待 sw1 完成。一旦 sw1 完成其任务,它将通知 sw2。我通过互联网和 stackoverflow 引用了很多参考资料。这是几乎符合我要求的一个。我试图在启动 sw1 的类中创建一个静态最终对象:
public final static Object lockObject = new Object();
然后在 sw1 的 done() 方法中,我编写了如下代码:
synchronized(lockObject) {
sw1.notifyAll();
}
在第二类的 doInBackground() 方法的第一行,我编写了如下代码:
synchronized(FirstClass.lockObject) {
try {
sw2.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
但是我在 java.lang.Object.notifyAll(Native Method) 处得到了 java.lang.IllegalMonitorStateException。谁能告诉我问题是什么以及如何使它按我想要的方式工作。
更新:根据欧内斯特的解决方案,我修改了我的代码,现在看起来像:
FirstClass.java
public final static Object lockObject = new Object();
public static boolean flag = false;
someMethod() {
synchronized(lockObject){
sw1.doInbackground() {
......
}
sw1.done() {
.....
flag = true;
lockObject.notifyAll();
}
}
}
SecondClass.java
anotherMethod() {
sw2.doInbackground() {
try {
while (!FirstClass.flag) {
FirstClass.lockObject.wait();
}
FirstClass.flag = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
......
}
}
但是我仍然在 lockObject.notifyAll() 行上收到 java.lang.IllegalMonitorStateException 。你能告诉我这样做是否正确吗?
谢谢。