私のアプリケーションには、1 つのテキスト フィールドと 1 つのボタンがあります。テキストフィールドからフォーカスが失われた後、最初のスイングワーカー (sw1 と仮定します) が呼び出されます。これにより、ポップアップが開き、テキスト フィールドに入力する値が入力されます。ユーザーがボタンをクリックすると、2 番目の swing ワーカー (sw2 と仮定します) が呼び出されます。問題は、テキスト フィールドに何かを書き込んでボタンをクリックすると、最初に sw1 が開始されてテキスト フィールドに入力する値が計算され、同時に sw2 も開始されるということです。そして、sw2 が最初に終了し、次に sw1 が結果を取り込みます。私が望むのは、sw2 が sw1 の終了を待つことです。sw1 がタスクを完了すると、sw2 に通知します。インターネットとスタックオーバーフローで非常に多くの参考文献を参照しました。これは私の要件にほぼ一致するものです。sw1を開始するクラス内に静的最終オブジェクトを作成しようとしました:
public final static Object lockObject = new Object();
次に、sw1 の done() メソッド内に、次のようなコードを記述しました。
synchronized(lockObject) {
sw1.notifyAll();
}
2 番目のクラスの 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 を取得しています。私がそれを正しく行っているかどうか教えてください。
ありがとう。