我马上说我是编写多线程应用程序的新手,所以不要严格判断:) 我有一个 servlet,其中的操作与数据库异步执行。仅当对数据库执行操作时,才会准备好对 http 请求的响应。在异步 onDataChange() 方法结束时,调用了 responseReadyListener 方法,该方法应该继续主线程的工作。
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
//...
//вызывается при завершении работы с базой данных
responseReadyListener = new ResponseReadyListener() {
@Override
public void onResponseReady() {
responseReady[0] = true;
Log.info("onResponseReady");
synchronized (this) {
this.notify();
Log.info("threadNotified");
}
}
};
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//асинхронный метод. После завершения работы с базой данных
//вызывается onResponseReady(), который должен продолжить
//работу основного потока.
responseReadyListener.onResponseReady();
}
});
//основной поток, не должен завершаться пока responseReady[0] = false;
while (!responseReady[0]) {
Log.info("entered stopping loop");
try {
synchronized (this) {
if (!responseReady[0]) {
Log.info("stoppingPerformed");
this.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.info("respSent");
}
}
我运行的所有日志:
INFO: entered stopping loop
INFO: stoppingPerformed
INFO: onResponseReady
INFO: threadNotified
此外,没有执行任何其他操作,就好像它挂起一样。可能是什么问题呢?没有提取物。
我怀疑问题在于不同对象的同步。
this
在嵌套类中是指嵌套类,在这种情况下是匿名实现ResponseReadyListener
:您可以通过引用
this
父类来解决此问题:或选择其他对象进行同步。
Z.Y. 另外我不确定
responseReady
父线程中是否可以使用更改。我会使用像AtomicBoolean
.