我想使用類作爲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());
}
}
Getted輸出爲:
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!
怎麼回事?爲什麼在顯示器發佈之前我進入同步模塊? P.S.我有一個想法,即將觀察者添加到MyThread對象,可能是我將觀察者添加到線程對象?但我怎麼能做到這一點?
似乎沒有其他線程通知等待線程後 – prasanth
你線程卡在這裏'this.wait();' – prasanth