我有一个要使其同步的底层异步无序查询/响应系统.可以通过用唯一的ID标记查询来映射查询和响应,这些ID会依次伴随相应的响应.
我尝试使其同步使用两个ConcurrentHashMap:一个从ID映射到结果,另一个从相同ID映射到CountDownLatches.执行查询时,代码如下所示:
public Result execute(Query query) throws InterruptedException {
int id = atomicInteger.incrementAndGet();
CountDownLatch latch = new CountDownLatch(1);
latchMap.put(id, latch);
query.executeAsyncWithId(id); // Probably returns before result is ready
try {
latch.await(); // Blocks until result is ready
return resultMap.remove(id);
} catch (InterruptedException e) {
latchMap.remove(id); // We are not waiting anymore
throw e;
}
}
以及用于处理传入结果的代码:
public void handleResult(Result result) {
int id = result.getId();
CountDownLatch latch = latchMap.remove(id);
if (latch == null) {
return; // Nobody wants result
}
resultMap.put(id, result);
latch.countDown();
}
从一个线程读取该方法,该线程从底层系统读取所有传入的结果(只有一个这样的读取器线程).
首先,我不确定线程??安全性,但是似乎也不必为此使用两个HashMap(特别是因为ID从未被重用).有任何改进的想法吗?