クラスを Observer および Observable として使用しようとしています。このクラスはスレッドとして実行されます。run() メソッドではスレッドが待機し、イベントを取得した後にスレッドに通知されます。サンプルコードがあります:
public class Runner {
public static void main(String[] args) {
MyThread mt = new MyThread();
Controller c = new Controller();
mt.addObserver(c);
c.addObserver(mt);
Thread t = new Thread(mt);
t.start();
}
}
public class MyThread extends Observable implements Observer, Runnable {
static private Integer op = 0;
public void run() {
synchronized (this) {
while (true) {
op++;
System.out.println(op + " Thread started");
super.setChanged();
super.notifyObservers(new Object());
op++;
System.out.println(op + " Thread send event");
try {
op++;
System.out.println(op + " Thread wait");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public void update(Observable arg0, Object arg1) {
op++;
System.out.println(op + " Thread got event");
synchronized (this) {
op++;
System.out.println(op + " We are in synchronized block!");
this.notify();
}
}
}
public class Controller extends Observable implements Observer {
public void update(Observable arg0, Object arg1) {
System.out.println("Controller get and send event");
super.setChanged();
super.notifyObservers(new Object());
}
}
得られた出力は次のとおりです。
1 Thread started
Controller get and send event
2 Thread got event
3 We are in synchronized block!
4 Thread send event
5 Thread wait
そして、スレッドはロックされたままです。期待される出力:
1 Thread started
Controller get and send event
2 Thread got event
3 Thread send event
4 Thread wait
5 We are in synchronized block!
何がうまくいかないのですか?モニターがリリースされる前に同期ブロックに入るのはなぜですか? PS私は問題がMyThreadオブジェクトにオブザーバーを追加していると考えています.Threadオブジェクトにオブザーバーを追加するのでしょうか? しかし、どうすればこれを行うことができますか?