我有一个servlet,它使用http get从另一个服务器请求地理定位。响应通过来自其他服务器的回调接收,最终在另一个servlet中。理想情况下,我想在第一个servlet上返回一个映射,并使这个异步机制同步。我现在所能提出的就是轮询一个共享的hashmap,直到值存在,这看起来有点像丑陋的黑客。我有什么想法可以更优雅地实现这个目标吗?
答案 0 :(得分:3)
在最基本的层面上,使用条件变量比非阻塞循环更有效。
// global, shared lock.
final Lock lock = new ReentrantLock();
final Condition locationReceived = lock.newCondition();
// first servlet:
//
lock.lock();
try {
requestLocation();
if (!locationReceived.await(10, TimeUnit.SECONDS)) {
// location was not received in the timeout.
} else {
// read location from shared object.
}
} finally {
lock.unlock();
}
// servlet that receives geolocation
//
lock.lock();
try {
// set location in shared object.
locationReceived.signal();
} finally {
lock.unlock();
}