所以,我有以下对象(为了举例而简化):
public class SomeListener implements EventListener{
public final Object lock = new Object();
public int receivedVal;
@Override
public onDataAvailable(int val){
synchronized(lock){
System.out.println("listener received val: " + val);
receivedVal = val;
lock.notifyAll();
}
}
}
我在主线程的某处有这段代码(再次简化):
SomeListener listener = new SomeListener();
EventGenerator generatorThread = new EventGenerator();
generatorThread.addListener(listener);
synchronize(listener.lock){
generatorThread.start();
listener.lock.wait();
System.out.println("value is: " + listener.receivedVal);
}
//some other stuff here....
现在,EventGenerator 对象使用 val = 1 调用“onDataAvailable”,然后在不同线程上使用 val = 2。基本上,我希望看到的是:
listener received val: 1
value is: 1
listener received val: 2
但是,我通常会得到:
listener received val: 1
listener received val: 2
value is: 2
就好像第二次调用“onDataAvailable”在主线程被唤醒之前获取了锁。在“onDataAvailable”的同步块之后进行简单的 println 或短暂睡眠就足以获得预期的结果,但这似乎是一个丑陋的补丁。
我在这里做错了什么?
请注意,我无法控制调用侦听器的线程。它基本上是一个通过网络接收事件的线程。有时它会在同一条消息中接收多个事件,因此会一个接一个地多次调用“onDataAvailable”,这导致了我的问题。其他时候,它会在两个不同的消息中接收两个事件,从而为主线程在事件之间唤醒足够的时间。